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.
更多细节:托管,非托管,原生:这是什么类型的代码?