1

那是我的问题,我计划实现一个具有许多 C++ 依赖项的 C++ dll,我想在我的 c# 代码中使用它。我想知道的是 CLR 是否会自行加载依赖项,或者我会必须做其他事情。在 C# 中加载 C++ dll 时,CLR 是否会自动加载 C++ 文件的依赖项?

4

3 回答 3

4

如果它是本机 C++ dll,则在加载时加载依赖项,除非该依赖项标记为延迟加载,然后在调用该 dll 中的函数之一时加载该依赖项。

如果它是 .Net C++ dll,则在需要时加载依赖项。

于 2013-04-15T15:18:51.560 回答
2

从技术上讲,答案是否定的。CLR不加载本机 DLL 的依赖项——但这纯粹是技术性问题——它们将自动加载(如果可能且可用)。

实际发生的事情有点复杂。CLR(本身)根本不加载 DLL——DLL 由本机 Windows 加载程序加载。对于 .NET 程序集,您将 CLR 代码存储为基本上是二进制资源。您还有一个调用 CLR 的本机入口点的 DllMain。当从 DllMain 调用 CLR 时,它会初始化程序集。

普通的 Windows 加载器(当然)也会加载原生 DLL。在这种情况下,加载程序(在没有延迟加载标志的情况下)将通过 DLL 依赖项并加载它们。即使初始 DLL 的加载是从 CLR 触发的,CLR 也不会进一步参与,直到 DLL 及其所有隐式依赖项都已加载。只有所有这些 DLL(也可能包括字体、可执行文件等)都被“加载”之后,控制权才会完全返回给 CLR。

请注意,我将“已加载”放在引号中是有原因的——DLL 通常也不会加载到内存中——加载器只会设置页表以将其映射到内存,然后这些页面将按需加载(尽管某些页面,例如那些持有DLL的 DllMain 的页面,在调用其 DllMain 时或多或少会立即加载)。

因此,假设您有一个 .NET 程序集,该程序集使用具有本机依赖项的本机 DLL,则顺序为:

  1. 负载组件
  2. 程序集的 DllMain 调用 CLR
  3. CLR 加载本机 DLL
  4. Loader 加载原生 DLL 的所有依赖项
  5. 只有在加载了所有隐式依赖项之后,控制权才返回给 CLR。
于 2013-04-15T15:40:53.687 回答
0

是的,但前提是它们在搜索路径中可用(即应用程序路径、Windows 系统路径等)

于 2013-04-15T15:17:09.637 回答