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

本文关键字:exe dll 文件 无效 提取 反射 资源 | 更新日期: 2023-09-27 18:08:03

我正试图将一些.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 Ultimate 64位。原始文件(我选择嵌入(是一个32位的文件。我也尝试过使用dll文件,提取的dll文件也无法作为原始文件使用。

你能指出我提取资源的代码中有什么错误吗?或者在我将其作为资源嵌入后文件就损坏了???

非常感谢您的帮助。谢谢

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

这:

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

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

你需要做这样的事情:

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

其中在.NET 4.0中添加了CCD_ 1。