2013-04-06 17 views
-1

我试图将一些.exe和.dll文件嵌入到我的应用程序中(只需将所需文件包含到我的项目中,右键单击它们并将生成操作更改为“嵌入式资源”)。这里是我的代码以提取:使用反射从资源提取的.exe和.dll文件无效?

private void ExtractTo(string path){ 
    string filename = "MyNamespace.Resources.MyEmbeddedEXEfile.exe"; 
    Assembly asm = Assembly.GetExecutingAssembly(); 
    string[] resourceNames = asm.GetManifestResourceNames(); 
    if(resourceNames.Contains(filename)){ 
     Stream s = asm.GetManifestResourceStream(filename); 
     byte[] buffer = new byte[s.Length]; 
     File.WriteAllBytes(path + "\\MyEXEfile.exe", buffer); 
    } 
} 

它似乎运作良好,嵌入的文件提取到传递的路径,它具有相同的大小,以我包括在我的项目和嵌入式的资源文件。但它似乎已损坏,点击提取的EXE文件后,出现错误对话框,显示“该文件的版本与您正在运行的Windows版本不兼容。请检查计算机的系统信息,看看您是否需要一个x86(32位)或x64(64位)的程序,然后联系你的软件发行商。“ 嗯,我正是该软件的发行商=))。

我正在使用Windows 7旗舰版64位。原始文件(我选择嵌入)是一个32位文件。我也尝试过使用dll文件,并且提取的dll文件也无法像原始文件一样工作。

请问您能否指出我的代码中提取资源时出现了什么问题,或者在我将其嵌入资源后文件被损坏?

您的帮助将不胜感激。谢谢。

+0

你没有努力自己解决问题。你有没有检查文件是否保存到磁盘?你有没有检查保存的文件是否与嵌入到程序集中的原始文件相同?你有没有检查原始文件是否在第一个地方运行? – 2013-04-06 17:57:47

+0

@NikolaRadosavljević他实际上做了,你只需要读一点:保存的文件具有相同的大小,并且他尝试执行。 (奇怪......他没有真正阅读......但仍然) – 2013-04-06 18:00:41

+0

@KingKing这可能也有帮助http://stackoverflow.com/questions/96732/embedding-one-dll-inside-another-as-an -embedded-resource-and-then-calling-it-fro?lq = 1 – 2013-04-06 18:04:14

回答

6

此:

Stream s = asm.GetManifestResourceStream(filename); 
byte[] buffer = new byte[s.Length]; 

...不流实际上复制到缓冲区。你在这里完成的是分配一个正确长度的空缓冲区。

你需要做这样的事情:

s.CopyTo(File.Create(path)); 

...其中CopyTo加入在.NET 4.0中。

+0

我正在使用.NET 3.5,有没有其他方法呢?谢谢。 – 2013-04-06 17:57:33

+0

@KingKing's.Read'然后写入文件 – 2013-04-06 17:58:19

+0

@caerolus谢谢,我正在寻找一个非常简短的方法,否则我必须编写一个while循环,事实上,我的嵌入文件大小可以超过最大整数长),所以需要一个while循环。谢谢! – 2013-04-06 18:26:24