为什么使用DllImport属性作为添加引用?

我见过几个这样的例子:

[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是不行的,否则不可能?

“但是,是不是说引用一个非托管的dll或者不可能引用它?”

是的,完全如此。 您正在考虑的“引用DLL”实际上是“引用.NET程序集” – 恰好,最常见的打包程序类型的方法是在DLL中引用。

DLLImport完全是关于导入’传统DLL’ – 即使用原始Windows DLL导出机制导出所有方法的DLL。

将DLLImport视为实际上被称为“UnmanagedImport”,事情可能更清楚。

某些库(如user32.dll)是非托管代码。 基本上这意味着他们没有必要的元数据来允许.Net通过引用与他们交谈(还有更多内容可以进入它,但希望这会给你足够的开端。)

  • 使用DllImport属性
  • DllImportAttribute
  • 的Win32 / COM
  • PInvoke.Net <=有关Windows的其他非托管库的更多信息
  • 托管与非托管开发

简而言之:

  • 添加引用用于:包含托管代码的 DLL文件

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

定义:

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

非托管代码直接在OS上运行的任何已编译二进制文件 ; 使用早于Visual Studio .NET 2002的任何东西编译的DLL。

更多细节: 托管,非托管,原生:这是什么类型的代码?

.NET平台代码编译为托管代码,并使用Assemblies存储,此程序集是.DLL文件,但并非所有.DLL文件都是包含托管代码的程序集。 您只能使用“添加引用”样式的托管代码。

其他语言和开发技术使用非托管代码生成.DLL文件,实际上您甚至可以与它们进行互操作(调用方法),但是您需要DLLImport属性