使用Reflection从资源中提取的.exe和.dll文件无效?

时间:2013-04-06 17:52:34

标签: c# reflection embedded-resource .net-assembly

我正在尝试将一些.exe和.dll文件嵌入到我的应用程序中(只需将所需文件包含到我的项目中,右键单击它们并将Build Action更改为“Embedded Resource”)。这是我提取的代码:

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 Ultimate 64位。原始文件(我选择嵌入)是一个32位文件。我也尝试过使用dll文件,提取的dll文件也不能用作原始文件。

你能否指出我的代码中提取资源有什么问题,或者我把它作为资源嵌入后文件已损坏???

我们非常感谢您的帮助。感谢。

1 个答案:

答案 0 :(得分:6)

此:

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

...实际上并没有将流复制到缓冲区中。你在这里所做的只是分配一个正确长度的空缓冲区。

你需要做这样的事情:

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

...在.NET 4.0中添加了CopyTo