为什么要使用DllImport属性而不是添加引用?

11

我看到了几个类似于这样的例子:

[DllImport("user32.dll")]
static extern bool TranslateMessage([In] ref Message lpMsg);

[DllImport("user32.dll")]
static extern IntPtr DispatchMessage([In] ref Message lpmsg);

但是,我不明白为什么有人要这样做,而不是像使用其他库一样引用DLL?MSDN指出:“DllImport属性在将现有的非托管代码重用于托管应用程序时非常有用。例如,您的托管应用程序可能需要调用非托管WIN32 API。”但是,这是否意味着引用非托管DLL是无用的或者除此之外不可能?

4个回答

27

"但是,这是否意味着引用非托管的 DLL 是没有用处的或者不可能?"

是的,完全正确。你所谓的“引用 DLL”实际上是“引用 .NET 程序集”——只是最常见的打包方式是使用 DLL。

DLLImport 完全是关于导入“传统 DLL”——也就是那些使用原始 Windows DLL 导出机制导出所有方法的 DLL。

想象一下将 DLLImport 实际上称为“UnmanagedImport”,事情可能会更清晰。


17

简而言之:

  • Add Reference 用于包含托管代码的 DLL 文件

  • DllImport 用于包含非托管代码的 DLL 文件

定义:

托管代码:只能在公共语言运行时(CLR)虚拟机管理下运行的代码,通常是 .NET Framework(或Mono)。

非托管代码:任何直接在操作系统上运行的已编译二进制文件;使用早于 Visual Studio .NET 2002 的任何编译器编译的 DLL。

更多细节:托管、非托管和本机代码是什么?


我又点了赞,因为这个解释得很好。所以对于那些莽撞地点踩的人真是太无礼了。应该禁止这种行为。 - Fandango68
@Fandango68我同意你的观点——这是一个很好的解释,我也点了赞。不知道为什么有人会踩。不过,我不确定你说的“它应该被禁止”的意思是什么。 - EJoshuaS - Stand with Ukraine
@EJoshuaS 在SO中的负投票想法根本行不通。这就像因为一个简单的错误或误解而抹黑某人一样。这就是为什么Facebook永远不会引入“踩”的原因。 - Fandango68

16

2
.NET平台的代码编译成托管代码,并使用程序集存储,这些程序集是.DLL文件,但并非所有的.DLL文件都包含托管代码。 你只能使用“添加引用”样式来使用托管代码。
其他语言和开发技术生成的.DLL文件具有非托管代码,实际上你甚至可以与它们交互(调用方法),但需要使用DLLImport属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接