标签:
互操作性是指托管代码和非托管代码之间的相互引用,托管代码是指在CLR控制之下执行的代码,非托管代码不受CLR的控制。我们使用托管代码和非托管代码的互操作性主要出于以下原因:
1. 有些功能C#类库没有实现或者C#类库封装的方法不符合我们的要求,但是在微软或者第三方开发的动态链接库中有相应的方法,比如存取IE浏览器的Cookie内容时,通常情况下,我们会调用非托管方法InternetSetCookie和
InternetGetCookie。
2. CLR在执行托管代码时由于垃圾回收机制、内存管理、安全性保障等功能会造成一定性能的损失,当我们对性能提出苛刻要求时,可以考虑使用非托管代码。
3. 互操作性使您能够保留和利用在现有非托管代码中的投入
4.可以更好的兼容非托管代码开发的产品,比如同一个产品的两个功能分别是由非托管代码和托管代码实现的,如果二者之间需要联系,比如通讯,互操作性可以非常容易的实现。
对于C#语言来说,有三种方式实现托管代码和非托管代码的互操作性。
1. 平台调用服务
2. C++互操作性
3. COM互操作性
下面首先介绍平台调用服务:
平台调用是一项服务,使托管代码能够调用动态链接库中实现的非托管代码,此服务定位并调用非托管函数,并根据需要跨交互操作边界封送其参数(整数、字符串、数组、结构等)。
平台调用的具体实现步骤如下(图片来自MSDN):
1.定位包含函数的dll
2.将dll加载到内存
3.获取调用方法在内存中的地址
4.封送参数,将参数从托管内存中加载到非托管内存
5.加载非托管方法的内存地址,执行费托管方法。
值得注意的是:仅在第一次执行非托管方法的时候加载其地址,之后在程序运行过程中会一直缓存内存地址。
A winner is a dreamer who never gives up.
标签:
原文地址:http://www.cnblogs.com/sauronKing/p/4786472.html