我正在尝试将一些.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文件也不能用作原始文件。
你能否指出我的代码中提取资源有什么问题,或者我把它作为资源嵌入后文件已损坏???
我们非常感谢您的帮助。感谢。
答案 0 :(得分:6)
此:
Stream s = asm.GetManifestResourceStream(filename);
byte[] buffer = new byte[s.Length];
...实际上并没有将流复制到缓冲区中。你在这里所做的只是分配一个正确长度的空缓冲区。
你需要做这样的事情:
s.CopyTo(File.Create(path));
...在.NET 4.0中添加了CopyTo
。