互操作性-平台调用

互操作性是指托管代码和非托管代码之间的相互引用,托管代码是指在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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/sauronKing/p/4786472.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值