0

我正在尝试将一些 .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 文件也无法作为原始文件使用。

您能否指出我提取资源的代码有什么问题,或者在我将其作为资源嵌入后文件立即损坏???

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

4

1 回答 1

6

这:

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

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

你需要做这样的事情:

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

...CopyTo在 .NET 4.0 中添加的位置。

于 2013-04-06T17:56:01.107 回答