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.

  • 相关阅读:
    剑指Offer 13.机器人的运动范围
    笔试题目-无向图是否全连通
    面试题目-最小代价的寻路问题
    京东一面问题
    剑指Offer 07.重建二叉树
    剑指Offer 12.矩阵中的路径
    剑指Offer 10-I.斐波那契数列
    剑指Offer 06.从尾到头打印链表
    剑指Offer 05.替换空格
    剑指Offer 04.二维数组中的查找
  • 原文地址:https://www.cnblogs.com/sauronKing/p/4786472.html
Copyright © 2011-2022 走看看