DllImport是如何真正工作的

本文关键字:工作 何真正 DllImport | 更新日期: 2023-09-27 17:55:25

我想了解DllImport是如何工作的。我需要一个简单的英语解释 - 意思是简单的解释。

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

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

DllImport是如何真正工作的

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

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

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

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