zoukankan      html  css  js  c++  java
  • 托管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函数)。“平台调用”依赖于元数据在运行时查找导出函数并封装其参数。图01公共语言运行库利用“平台服务”调用非托管DLL中的函数的流程图:


    图01:“平台服务”的调用非托管函数的流程图


      在托管代码中使用“平台调用”服务调用非托管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:
    regasm注册的是.net框架下生成的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文件,在.net环境下使用的话,可以使用regsvr32注册后,就可以在.net下使用了。

  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/lasthelloworld/p/4958966.html
Copyright © 2011-2022 走看看