我想了解DllImport
真正的工作原理。我需要一个简单的英文解释——意思是简单的解释。
它是否与 DLL 中的导出方法静态链接,例如“包含文件”指令/静态库?
还是当它到达 C# 程序中的执行点时,它是否从 DLL 中动态调用该方法?
它使用两个核心的 winapi 函数。首先是 LoadLibrary(),将 DLL 加载到进程中的 winapi 函数。它使用您为 DLL 指定的名称。第二个是GetProcAddress(),winapi 函数,它返回DLL 中函数的地址。它使用您指定的函数的名称。然后一些管道运行,使用您指定的参数为函数调用构建堆栈框架,并在它找到的地址调用函数。
所以是的,这是非常动态的。直到您的代码实际落在调用 pinvoked 函数的语句上,才会发生这种情况。技术术语是“后期绑定”,而不是 Windows 加载程序用于本机代码的更常见的早期绑定。
它动态调用它。DLLimport 不会在您编译的程序中嵌入任何内容。这就是为什么当您使用 DLLImport 时,确保最终用户在正确的位置拥有正确的 DLL 非常重要,否则您的程序将无法运行。
后者 - 您可以通过指定一个不存在的 dll 名称来说服自己。当然,您将能够很好地编译和运行,但不能调用该函数。