Kin*_*ing 0 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);
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎运行良好,嵌入式文件被提取到传入的路径,它与我在项目中包含的文件大小相同,并作为资源嵌入.但是在点击提取的EXE文件后,它似乎已损坏,显示一个错误对话框,说明" 此文件的版本与您正在运行的Windows版本不兼容.检查计算机的系统信息,看看是否需要程序的x86(32位)或x64(64位),然后联系您的软件发行商. "好吧,我正是该软件的发布者=)).
我使用的是Windows 7 Ultimate 64位.原始文件(我选择嵌入)是一个32位文件.我也试过一个dll文件,提取的dll文件也不能像原来的那样工作.
你能指出我的代码中提取资源有什么问题,或者我把它作为资源嵌入后文件被破坏了吗???
非常感谢您的帮助.谢谢.
这个:
Stream s = asm.GetManifestResourceStream(filename);
byte[] buffer = new byte[s.Length];
Run Code Online (Sandbox Code Playgroud)
...实际上并没有将流复制到缓冲区中.你在这里所做的只是分配一个正确长度的空缓冲区.
你需要做这样的事情:
s.CopyTo(File.Create(path));
Run Code Online (Sandbox Code Playgroud)
... CopyTo
.NET 4.0中添加了哪些内容.