C#中托管DLL和非托管DLL的区别详解
首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。
托管DLL文件,可以在Dotnet环境通过“添加引用”的方式,直接把托管DLL文件添加到项目中。然后通过UsingDLL命
名空间,来调用相应的DLL对象。
非托管DLL文件,在Dotnet环境应用时,通过DllImport调用。
C#调用非托管DLL文件。DLL文件是用C语言编写的。
托管DLL就是能够在公共语言运行库(CommonLanguageRuntime,简称CLR)中能够直接引用的,并且扩展名为“DLL”的文件。
具体所指就是封装各种命名空间所在的DLL文件,如System.dll等。非托管DLL就是平常所的动态链接库等,其中就包括了封装所有WindowsAPI函数的DLL文件。各种非托管DLL中的函数在公共语言运行库中不能直接被调用,而需要经过.Net框架提供的“平台调用”服务后才可以。
“平台调用”是.Net框架为VisualBasic.Net、VisualC#等.Net开发语言提供的一种服务,用以在托管代码中引入各种
非托管DLL中封装的函数(其中包括WindowsAPI函数)。“平台调用”依赖于元数据在运行时查找导出函数并封装其参数。
在托管代码中使用“平台调用”服务调用非托管DLL中封装的函数时,“平台服务”将依次执行以下操作:
1.查找包含该函数所在的DLL文件。
2.如果找到,则将该DLL文件加载到内存中。
3.查找函数在内存中的地址并将其参数推到堆栈上,并封送所需的数据。
4.将控制权转移给非托管函数。这样整个函数调用完成。
在VisualBasic.Net中使用“平台调用”服务,申明WindowsAPI函数主要有二种具体的实现方法:
1.使用DllImport特征类来申明WindowsAPI函数。
2.使用“Declare”语句来申明WindowsAPI函数。
这二种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明WindowsAPI函数时出错,所以并不提倡。而第二种方法相对简单,并且又保存了以前VisualBasic中的很多语法,所以在平常时大都使用这种方
法来申明WindowsAPI函数。
regasm:
regasm注册的是.net框架下生成的dll(托管与clr)
regsvr32:
regsvr32注册的是要用C++写的(非托管)
而C#写的就必须用Regasm注册
托管DLL,说白了,就是完全由.NET托管代码实现的DLL,完全依赖于.NET平台的CLR运行。托管DLL,受.NETCLR管控,支持内存自动回收等的,对于.NET平台是安全DLL
非托管DLL,是指完全或者部分不是用.NET代码实现,不依赖于.NET平台即可运行,例如COM方式的DLL,不支持自动回收内存,对于.NET平台而言,也是非安全可控的。
其他平台的使用vc++、vb等语言写成的dll文件,在.net环境下使用的话,可以使用regsvr32注册后,就可以在.net下使用了。
到此这篇关于C#中托管DLL和非托管DLL的区别详解的文章就介绍到这了,更多相关C#托管DLL和非托管DLL内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!