2

运行 csi.exe 时出现以下错误:

System.BadImageFormatException:无法加载文件或程序集“xyz.dll”或其依赖项之一。不是有效的Win32应用程序。(来自 HRESULT 的异常:0x800700C1)

在 Visual Studio 中编译会引发警告,但编译和运行没有问题:

正在构建的项目“MSIL”的处理器架构与参考“xyz”、“x86”的处理器架构不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改项目的目标处理器体系结构,以便在项目和参考之间对齐处理器体系结构,或者依赖具有与项目的目标处理器体系结构匹配的处理器体系结构的参考。

所以看来我必须在运行 csi.exe 时指定处理器架构?怎么做?

4

1 回答 1

6

您的程序集 xyz.dll 被编译为仅在 32 位进程中运行。这可能是有充分理由的(例如加载另一个仅适用于 32 位代码的本机 dll)。在这种情况下,请使用下面介绍的解决方案。这也可能没有充分的理由。在这种情况下,更改 xyz.dll 的目标平台。


程序 CSI.exe(C# 交互式编译器)的构建方式使其在 32 位版本的 Windows 上作为 32 位可执行文件运行,在 64 位版本的 Windows 中作为 64 位可执行文件运行。

当作为 64 位可执行文件运行时,它将无法加载构建为仅在 32 位进程中运行的程序集(例如您的 xyz.dll)。


为了改变这一点,您可以创建一个版本的 CSI.exe,即使在 64 位版本的 Windows 上也可以作为 32 位进程运行。跟着这些步骤:

  1. 找到文件 csi.exe,在同一目录中制作一份副本,并将副本重命名为 csi32.exe。您可以在类似于“C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe”的路径中找到 csi.exe
  2. 找到文件 CorFlags.exe。您可以在类似于“C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\CorFlags.exe”的路径中找到 CorFlags.exe
  3. 以管理员身份打开命令行窗口。
  4. 使用两个可执行文件的正确路径执行以下命令

    C:\Path\To\CorFlags.exe /32bit+ /force C:\Path\To\csi32.exe

您现在可以使用 csi32.exe 代替 csi.exe 来运行需要仅在 32 位版本中可用的程序集/dll 的脚本。

于 2017-03-04T21:53:57.623 回答