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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。