从托管程序集(C#)上的非托管进程(本机C++)调用LoadLibrary()时,预期的行为是什么



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

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

编辑:

问题在评论中得到回答,结束。

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

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

最新更新