托管DLL和非托管DLL的区别
来源:互联网 发布:linux vi指令什么意思 编辑:程序博客网 时间:2024/05/17 18:03
首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。
托管DLL文件:可以在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using DLL命名空间,来调用相应的DLL对象 。
非托管DLL文件:在Dotnet环境应用时,通过 DllImport 调用。
托管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函数。
0 0
- 托管DLL和非托管DLL的区别
- 托管DLL和非托管DLL的区别
- 托管DLL和非托管DLL的区别
- 托管调用非托管的DLL
- 关于Dll、Com组件、托管dll和非托管dll的理解
- 关于Dll、Com组件、托管dll和非托管dll的理解
- C# 非托管Dll
- C# 非托管Dll
- c#中使用托管和非托管dll
- 托管和非托管的区别
- 托管和非托管的区别
- C#调用非托管DLL的APIs
- C#调用非托管DLL的APIs
- 如何调用非托管的dll
- C#.Net调用非托管的DLL
- 托管非托管Dll动态调用
- 托管非托管Dll动态调用
- 判断dll是托管还是非托管
- e5-7uva136 丑数
- iOS 加载图片时的内存警告
- android application
- 梯度下降
- sgu217:Two Cylinders(simpson积分)
- 托管DLL和非托管DLL的区别
- Vbs脚本经典教材
- Oracle Apps User Monitor(监控用户)
- synchronized 与Lock类
- eclipse导出来javadoc帮助文档
- [学习记录]Xcode的一些快捷按键
- 【学习笔记】JavaScript编码规范-字符串
- c# json数据解析——将字符串json格式数据转换成对象
- 网络编程中出现connection refused错误