zoukankan      html  css  js  c++  java
  • 互操作性-平台调用

    互操作性是指托管代码和非托管代码之间的相互引用,托管代码是指在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.

  • 相关阅读:
    PowerDesigner概念设计模型(CDM)中的3种实体关系
    基于Prototype 1.6.2 框架下的数据分页
    中国地区,北京54坐标系条带号的选
    C#中MessageBox的使用
    C#注册表的读,写,删除,查找 (转)
    C# Tostring() 格式大全 [转]
    Layer features in this layer set, ArcEngine图层标注源码 (转)
    判断点是否在多边形之内的方法
    C#导入Excel到Dataset和导出Excel到DataTable
    Server.MapPath方法的应用方法
  • 原文地址:https://www.cnblogs.com/sauronKing/p/4786472.html
Copyright © 2011-2022 走看看