2

在动态加载程序集时,我在 C++/CLI 中遇到异常,该程序集本身在 C++/CLI 托管模式下使用Assembly.Load. 它成功加载了 DLL 程序集,但无法加载 EXE 程序集并生成以下异常:

TestManager.dll 中发生了“System.IO.FileLoadException”类型的未处理异常

无法加载文件或程序集“testAssembly,Version=1.0.3836.39802,Culture=neutral,PublicKeyToken=null”或其依赖项之一。尝试使用 fixups 加载无法验证的可执行文件(IAT 具有超过 2 个部分或 TLS 部分。)

HRESULT 异常:0x80131019

TestManager.dll 本身是一个托管 dll,并在 CLI 中加载到另一个 CLR 进程中,并尝试将 EXE 程序集作为单独的进程加载,但失败并生成异常。

这可能是由于玩混合模式。

4

3 回答 3

5

"A mixed mode C++ EXE cannot be relocated in memory properly when loaded as a referenced assembly. This is why there is a runtime failure."

The quote is from Microsoft's response to this bug on Connect, where they explain that they're not going to fix it (too much trouble for a rare situation).

于 2010-07-03T19:31:25.173 回答
1

TL;DR:/clr通过将 CLR 支持从 更改为.将您的程序集类型从混合更改为仅托管/clr:pure

详细信息:
我今天遇到了一个非常相似的情况:
我有各种托管 DLL,所有这些 DLL 都是用它们编译的,/clr因为其中一些导入了本机 DLL。
我有一个 EXE,也是用/clr.
它们都是用 C++/CLI 编写的。

到目前为止,所有用户控件都在 DLL 中。今天我在EXE的程序集中创建了一个UC,想把这个UC插入到EXE的主窗体中。它失败了,只是说

无法加载工具箱项目。它将从工具箱中删除。

没有其他的。

于是新建了一个winforms项目,添加了对EXE的引用(工作),并尝试在Visual Studio Designer Toolbox中添加EXE的控件。最后一个操作失败,错误消息是

尝试使用修正加载无法验证的可执行文件(IAT 具有超过 2 个部分或 TLS 部分。)

在第二条失败消息中,我发现了这篇 Stackoverflow 帖子,其中@Stephen 显然在上面引用

“作为引用程序集加载时,混合模式 C++ EXE 无法在内存中正确重定位。这就是运行时失败的原因。”

来自 MSDN。这意味着如果消息正确,我正在编译为混合模式程序集 EXE。因此,我查找了可以更改我创建的程序集类型的位置,并在 MSDN 上找到了Mixed (Native and Managed) Assemblies,它链接到一些带有详细描述的页面,其中之一是 Pure and Verifiable Code (C++/CLI)在那里我看到我必须使用/clr:pure.

在为我的 EXE 程序集(不是 DLL,它们保持混合)更改此设置后,我能够将其添加到测试项目的 VS Designer 工具箱中,并将 UC 插入到 EXE 的主窗体中。

于 2017-03-01T10:28:19.137 回答
0

我认为您需要在.NET 中使用命名管道进行进程间通信。Assembly.Load 不适用于 EXE 程序集。

于 2010-07-04T16:39:24.470 回答