如何在AppDomain中执行非托管程序集?

3
当执行非托管程序集时,我遇到以下错误:
“无法加载文件或程序集'file:///C:\Program Files\Maxima-5.21.1\lib\maxima\5.21.1\binary-gcl\maxima.exe'或其某一个依赖项。该模块是预期包含一个程序集清单。”
那我该怎么办呢?使用AppDomain无法执行非托管程序集吗?
3个回答

6
  1. AppDomains是纯托管的构造。在进程中运行的任何非托管代码都不受AppDomain边界的影响,并且可以完全访问所有进程内存、数据和代码。

  2. 非托管程序集的执行方式与托管程序集不同。加载程序集、查找并执行非托管程序集入口点的过程与托管程序集不同,因此会出现特定的失败情况。

  3. 如果您想执行未托管dll导出的函数,应使用P/Invoke,这将确保使用正确的机制加载程序集并调用适当的入口点。

  4. 在您上述的场景中,您无法从可执行文件中运行代码;您只能启动一个新进程。


2

你是正确的,未经管理的DLL无法加载到AppDomain中。您需要使用P/Invoke来调用DLL中的方法。


我的汇编是可执行的。我可以使用Process类来执行它。然而,使用Process将限制我想要避免的可扩展性。 - Second Person Shooter
@Xport,最近这里有其他类似的问题。不幸的是,没有办法将另一个可执行文件加载到AppDomain中并运行它,特别是如果它不是.NET可执行文件。 - Rob
@Rob - 从技术上讲,这是可能的,但需要非常明确地了解操作系统进程负载和启动过程,以便在进程内复制它。 - Franci Penov
Franci Penov的声明:“在新的应用程序域中注入代码而不是启动新进程,可扩展性较差。” <=== 这似乎与我所读到的相反,因为每当您想要实例化许多可执行程序集时,AppDomain都很有用来扩展可扩展性。 - Second Person Shooter
@xport - 是的,当涉及到启动新实例的速度、IPC通信和其他一些方面时,AppDomains确实具有优势。然而,也存在成本——受限于一个进程的内存地址空间(在32位操作系统上约为3GB),无法在多台机器上进行负载平衡,没有非托管代码隔离,无法使用标准的操作系统按需激活机制等等。因此,使用AppDomains与进程相比的可伸缩性取决于具体情况。 - Franci Penov
显示剩余2条评论

2
执行非托管程序集:
首先,这是不存在的。根据定义,“程序集”(其物理形式为.DLL文件)始终是托管的。非托管DLL只是根据定义不是程序集。 DLL在.NET之前就存在了,而在此上下文中,“程序集”一词是特定于托管的.NET DLL。
确切地说,使用AppDomain执行非托管程序集是不可能的。哪个部分的广泛文献表明可以呢?
您可以使用以下方法:
- P / Invoke调用DLL中的函数。这有时真的很难,因为.NET托管API对于某些非托管结构构造并不那么优雅。 - 使用C++ / CLI创建引用DLL的程序集。托管C ++非常适合弥合差距。

1
嗯,那有点不正确。Windows并行引擎(Fusion)也可以处理非托管代码,并且它们仍然被称为程序集。程序集本质上是一个或多个二进制文件的集合,代表了具有单一标识的代码单元。无论这些代码单元是托管的还是非托管的都是无关紧要的。 - Franci Penov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接