【问题标题】:CodeDom + Assembly.Load throws a BadImageFormatExceptionCodeDom + Assembly.Load 引发 BadImageFormatException
【发布时间】:2014-12-17 14:09:39
【问题描述】:

我正在尝试从给定的字节数组中执行一个文件,效果很好:

byte[] bytes = File.ReadAllBytes(@"C:\Location\program.exe");
MessageBox.Show(bytes.Length) // The same size for both the VS compiled and CodeDom compiled application
Assembly assembly = Assembly.Load(bytes); //Throws exception when compiled with CodeDOM

这段代码在我用 Visual Studio 生成的应用程序中编译并运行良好。

但是,当我将这段代码添加到使用 CodeDOM 生成的应用程序时,它会引发 BadImageException。

CodeDOM 生成的应用程序可以很好地读取字节,因为两个版本都输出相同的 byte[] 长度。

我尝试将目标框架从 .NET 2.0 更改为 .NET 4.5,我尝试更改目标架构,但无法使其正常工作。

什么会导致这个异常?

【问题讨论】:

  • 这可能是因为 64bit 和 32bit 冲突。您可以尝试在不同类型的架构中加载程序集。您的程序集有问题,或者加载该程序集的程序有问题
  • 我将程序集的目标体系结构设置为 x86,现在 codeDOM 应用程序可以毫无问题地加载它,谢谢!但是为什么用VS2012生成的应用没有这个问题呢?
  • 不,不是那样的。这是您构建项目的方式。我将在答案中详细描述,以便场景对其他人有所帮助。
  • 什么不像什么?我用 VS 构建的应用程序可以正常运行“任何 cpu”程序集,而 CodeDOM 生成的应用程序只能在我的 64 位系统上运行“x86”?
  • 这样做根本没有意义,请改用 CompilerResults.CompiledAssembly。

标签: c# .net codedom badimageformatexception


【解决方案1】:

问题在于程序集体系结构和加载程序集的应用程序。

因此,如果应用程序使用 X64 构建,并且如果它尝试使用 X86 加载程序集,则会产生问题。这也适用于相反的情况。

其他情况是,当使用 Visual Studio 构建应用程序时,默认选项是 Any CPU。

在这种情况下,当进程为 64 位时,它将加载为 64 位,而当应用程序为 32 位时,它将加载为 32 位。我们限制这种方式是因为一些非托管资源在特殊环境下工作。

我在.net的Oracle客户端遇到这样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多