12

我想了解DllImport真正的工作原理。我需要一个简单的英文解释——意思是简单的解释。

它是否与 DLL 中的导出方法静态链接,例如“包含文件”指令/静态库?

还是当它到达 C# 程序中的执行点时,它是否从 DLL 中动态调用该方法?

4

3 回答 3

25

它使用两个核心的 winapi 函数。首先是 LoadLibrary(),将 DLL 加载到进程中的 winapi 函数。它使用您为 DLL 指定的名称。第二个是GetProcAddress(),winapi 函数,它返回DLL 中函数的地址。它使用您指定的函数的名称。然后一些管道运行,使用您指定的参数为函数调用构建堆栈框架,并在它找到的地址调用函数。

所以是的,这是非常动态的。直到您的代码实际落在调用 pinvoked 函数的语句上,才会发生这种情况。技术术语是“后期绑定”,而不是 Windows 加载程序用于本机代码的更常见的早期绑定。

于 2013-01-23T02:56:37.210 回答
7

它动态调用它。DLLimport 不会在您编译的程序中嵌入任何内容。这就是为什么当您使用 DLLImport 时,确保最终用户在正确的位置拥有正确的 DLL 非常重要,否则您的程序将无法运行。

于 2013-01-23T02:43:33.217 回答
2

后者 - 您可以通过指定一个不存在的 dll 名称来说服自己。当然,您将能够很好地编译和运行,但不能调用该函数。

于 2013-01-23T02:43:14.607 回答