SauronKing

写随笔只是为了记录自己的曾经,如果能给您带来些许方便,那是我莫大的荣幸!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

互操作性是指托管代码和非托管代码之间的相互引用,托管代码是指在CLR控制之下执行的代码,非托管代码不受CLR的控制。我们使用托管代码和非托管代码的互操作性主要出于以下原因:

1. 有些功能C#类库没有实现或者C#类库封装的方法不符合我们的要求,但是在微软或者第三方开发的动态链接库中有相应的方法,比如存取IE浏览器的Cookie内容时,通常情况下,我们会调用非托管方法InternetSetCookie和

InternetGetCookie。

2. CLR在执行托管代码时由于垃圾回收机制、内存管理、安全性保障等功能会造成一定性能的损失,当我们对性能提出苛刻要求时,可以考虑使用非托管代码。

3. 互操作性使您能够保留和利用在现有非托管代码中的投入

4.可以更好的兼容非托管代码开发的产品,比如同一个产品的两个功能分别是由非托管代码和托管代码实现的,如果二者之间需要联系,比如通讯,互操作性可以非常容易的实现。

对于C#语言来说,有三种方式实现托管代码和非托管代码的互操作性。

1. 平台调用服务

2. C++互操作性

3. COM互操作性

下面首先介绍平台调用服务:

平台调用是一项服务,使托管代码能够调用动态链接库中实现的非托管代码,此服务定位并调用非托管函数,并根据需要跨交互操作边界封送其参数(整数、字符串、数组、结构等)。

平台调用的具体实现步骤如下(图片来自MSDN):

image

1.定位包含函数的dll

2.将dll加载到内存

3.获取调用方法在内存中的地址

4.封送参数,将参数从托管内存中加载到非托管内存

5.加载非托管方法的内存地址,执行费托管方法。

值得注意的是:仅在第一次执行非托管方法的时候加载其地址,之后在程序运行过程中会一直缓存内存地址。

A winner is a dreamer who never gives up.

posted on 2015-09-06 16:42  SauronKing  阅读(471)  评论(0编辑  收藏  举报