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

m-y*_*m-y 11 c# dll reference dllimport visual-studio

我见过几个这样的例子:

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

[DllImport("user32.dll")]
static extern IntPtr DispatchMessage([In] ref Message lpmsg);
Run Code Online (Sandbox Code Playgroud)

但是,我不明白的是为什么有人会这样做只是像引用其他库一样引用DLL?MSDN声明:"在托管应用程序中重用现有的非托管代码时,DllImport属性非常有用.例如,托管应用程序可能需要调用非托管WIN32 API." 但是,那是说引用一个非托管的dll或者不可能引用它是没用的吗?

Wil*_*ean 26

"但是,是不是说引用一个不受管理的dll是不可行的,否则就不可能了?"

是的,确实如此.您所谓的"引用DLL"实际上是"引用.NET程序集" - 恰好这种情况恰好包装了一种易于引用的程序集的最常见方式是在DLL中.

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

将DLLImport视为实际上被称为"UnmanagedImport",事情可能更清楚.


Mat*_*ted 14

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


sla*_*oah 11

简而言之:

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

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

定义:

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

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

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

  • 我会帮你取消无意义的downvoter (3认同)