3

我已将托管接口添加到本机 C++ 应用程序,该应用程序实例化 CLR,创建自定义 appDomainManager,并提供将托管程序集加载到本机进程的调用。在我的本机 C++ LoadDLL() 函数中,我希望能够通过调用 LoadLibrary(dllPath) 来测试 .net 与 C++ 的传入 dll,我认为这将返回托管程序集的失败 (NULL),但我发现它而是返回一个句柄(这在非托管进程中当前没有运行 CLR)。这是对托管程序集的非托管 LoadLibrary() 调用的正常行为吗?

我不确定我是否理解 LoadLibrary 甚至可以找到合适的入口点来在托管程序集中进行测试。我知道(一种可能的)解决问题的方法,以及我计划实现的方法,就是使用 CLR 实例访问 .net 反射 API 并检查 DLL 是否首先在那里管理......但我'对 LoadLibrary() 没有返回失败的事实感到困惑,我想了解我在这里缺少什么。行为是否未定义,是否应该始终返回句柄,还是取决于托管程序集的配置?任何指向参考的链接表示赞赏。

编辑:

问题在评论中回答,关闭。

4

1 回答 1

1

不,他们不会做任何事情,托管程序的 dll/exe 只是一个存根(存根意味着模板但必不可少)程序,它将尝试调用 mscoree,它是 .Net 运行时执行器,也称为 shim,因为它将尝试选择 .net 框架的版本(并且本机函数名称称为 _CorExeMain),然后 shim 本身将引导 .Net 框架,并启动一个 clr 实例,然后开始在 PE 内处理 IL 代码,此外它只是 CIL 编译器生成的一些元数据,例如资源池(字符串池、常量值)、函数原型、继承和泛型类型。

有关更多信息,请深入查看:http ://blog.vuscode.com/malovicn/archive/2007/12/25/net-foundations-net-execution-model.aspx ,您不会失望的。

于 2014-07-30T09:41:24.237 回答