【问题标题】:What is the expected behavior of LoadLibrary() when called from an unmanaged process (native C++) on a managed assembly (C#)从托管程序集 (C#) 上的非托管进程 (本机 C++) 调用 LoadLibrary() 的预期行为是什么
【发布时间】:2013-08-01 00:54:21
【问题描述】:

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

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

编辑:

问题已在 cmets 中回答,结束。

【问题讨论】:

  • .NET 程序集在 Windows 中看起来就像一个普通的 DLL。所以 LoadLibrary 工作正常。接下来您通常会执行此操作,调用 GetProcAddress() 以在 DLL 中找到一个不起作用的入口点。纯托管的 .NET 程序集没有。所以不要使用LoadLibrary,这是没有意义的。一大堆sample code向你展示如何使用_AppDomain接口。
  • 感谢您的回复。我已经实现并工作了 _AppDomain 接口,我只是好奇为什么 LoadLibrary 没有在 .net 程序集上失败并想验证正常行为。调用在一个实际上无法执行任何有用操作的程序集上成功,这似乎不是很奇怪吗?这只是一个时髦的逻辑漏洞,还是将托管程序集加载到我不知道的非托管进程中还有其他用途?
  • 不,这并不奇怪。 .NET 程序集也可以包含非托管代码,因此调用 LoadLibrary + GetProcAddress 对于这样的程序集是完全合理的。当 DLL 没有导出函数时,Windows 中没有内置的特殊功能禁止调用 LoadLibrary。例如,仅包含资源的 DLL 是完全有效的。
  • 太棒了,谢谢你的信息
  • @HansPassant C++ 托管的 dll 怎么样。它可以在 C++ 应用程序中与 LoadLIbrary 一起使用吗?

标签: c++ .net unmanaged managed loadlibrary


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2010-10-08
    相关资源
    最近更新 更多