| 广告联系 | 繁体版 | 手机版 | 微信 | 微博 | 搜索:
欢迎您 游客 | 登录 | 免费注册 | 忘记了密码 | 社交账号注册或登录

首页

温哥华资讯

温哥华地产

温哥华教育

温哥华财税

新移民/招聘

黄页/二手

旅游
搜索:  

 论坛通告:  请不要上传第三方有版权的照片,请尊重版权,谢谢   转载新闻请务必注明出处,这些媒体请不要转,谢谢   批评商家需要注意  
 个人空间: 一袭绛襦落鹏城,疑似玄女下九天 | NotmeL8 | 湖里湖涂 | XY | 猪头看世界 | 白龙王许道长 | 罗蓬特机器人 | 五木森林 | lxls | 乱想 | 异乡的世界 | 花随风 | Amy Yi | 格局 | 真情Z下海 | 顾晓军 | 大温房产和地产研究 | 静观云卷云舒 | I am happy! | 53757645468
 最新求助: 请问谁知道哪里有卖理发的电动推子?   忽然有个疑问:战争时期,加拿大拿PR卡未入籍的永久居民会被强制服兵役吗?   这个银条   如何修改会员名?
 论坛转跳:
     发帖回帖获取加西镑, 兑换精彩礼物

论坛首页 -> IT人生

ZT: .NET Interop入门-P/Invoke和Reverse P/Invoke (发表于16年前)



回复主题  图片幻灯展示  增添帖子到书签中  给帖子中的发贴者批量赠送献花或者花篮    |##| -> |=|        发表新主题
阅读上一个主题 :: 阅读下一个主题  
作者 正文
webdriver
(只看此人)




文章 时间: 2009-4-05 23:10 引用回复
最近在论坛上经常看到一些基本的interop的问题,给我动力写完之前的.net interop入门系列,给刚刚涉足.NET interop的朋友们一个大体上的概念。

每每谈及.NET interop,我的脑中总是出现下面一幅图:



该图代表了.net interop的四个典型场景。之前我的同事和我讨论了.NET和COM互操作的应用:

* 在.NET中调用COM:COM Interop入门
* 在COM中调用.NET:在COM应用中使用.NET组件使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法

今天我主要讲一下P/Invoke和Reverse P/Invoke,和COM interop相比,P/Invoke无需注册组件,使用上更轻量,更绿色。

1. P/Invoke

P/Invoke(platform invoke)是.NET调用本地代码(native code)的一种比较轻便的方式。只需要将本地代码编写成动态链接库,然后在c#代码中,声明一个外部静态函数,并且用DllImport属性指明动态连接库的入口。举例如下:

代码:
using System;
using System.Runtime.InteropServices;

class PInvoke
{
    [DllImportAttribute("user32.dll", EntryPoint = "MessageBoxW")]
    public static extern  int MessageBoxW(
        [In]System.IntPtr hWnd,
        [In][MarshalAs(UnmanagedType.LPWStr)] string lpText,
        [In][MarshalAs(UnmanagedType.LPWStr)] string lpCaption,
        uint uType);

    public static void Main()
    {
        MessageBoxW(IntPtr.Zero, "Hello", "Interop", 0);
    }
}

稍加解释这个代码。类PInvoke中,有个MessageBoxW的函数声明,它的实现在user32.dll(系统自带)中,入口是MessageBoxW,参数的构成是根据windows API的声明而定的,我们在Codeplex上有一个工具,专门帮助大家声称一个本地代码(c++)编写的函数在托过代码(c#)中的函数声明,之前我们团队的成员也撰文介绍了这个工具的使用。

有了这个声明以后,在Main中调用MessageBox,就和调用其他托管代码一样轻松自如了。

2. Reverse P/Invoke

接着,我们来看看在本地代码中调用.NET方法。本地代码需要拿到一个.NET委托(delegate),然后把这个delegate当作一个函数指针使用,示例如下:

代码:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Program
{
    internal delegate void DelegateMessageBox([MarshalAs(UnmanagedType.LPWStr)]string msg);

    [DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern void NativeMethod(DelegateMessageBox d);

    public static void ShowMessageBox(string msg)
    {
       MessageBox.Show(msg);
    }

    public static void Main()
    {
        NativeMethod(new DelegateMessageBox(ShowMessageBox));
    }
}

这个例子中,我们希望本地代码能够调用托管函数ShowMessageBox来显示一个对话框。为了让本地代码可以调用这个函数,我们根据它的声明,定了了一个delegate,并且通过P/Invoke把这个委托传给了本地代码。本地代码可以如下调用托管代码:

代码:
#include <stdio.h>
#include <wtypes.h>

extern "C" {
    __declspec(dllexport) void NativeMethod(void (__stdcall *pShowMsgBox)(WCHAR *wChar))
    {
        (*pShowMsgBox)(L"hello reverse interop");
    }
}


注意到托管代码中的委托到了本地代码中,就是一个函数指针,本地代码可以像一个普通的函数指针一般调用托管代码。

大家可能注意到dll的声明用了extern “C”,它指明了调用规范是cdecl,在之前的托过代码的DllImport中,也相应的注明了调用约定,关于调用约定的详细介绍,可以参见我的另一篇博客。

今天的介绍就到这里,大家可以把这些示例代码当作一个template,根据实际需求作相应的具体改动。

Published Sunday, March 29, 2009 12:24 AM by SilverlightShanghai
Filed under: CLR Interop, .NET小贴士


 
花篮
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?


上一次由webdriver于2009-4-05 23:52修改,总共修改了1次
楼主 | 电梯直达
阅读会员资料 发送站内短信 主题 User photo gallery 礼物  
Castro
(只看此人)




文章 时间: 2009-4-05 23:19 引用回复
DING!
 
花篮
分享
沙发 | 返回顶端
阅读会员资料 发送站内短信 主题 User photo gallery 礼物  
nessus
(只看此人)



文章 时间: 2009-6-07 09:54 引用回复
不错。直接到他们的团队blog上看了看,东西不多不过他们自己开发的一个tool - TlmImp2挺不错的。可以直接调用COM库,然后生成Interop Assembly。
 
花篮
分享
板凳 | 返回顶端
阅读会员资料 发送站内短信 主题 User photo gallery 礼物  
飞舞的音符
(只看此人)



文章 时间: 2009-6-16 23:03 引用回复
学习中。。。
 
花篮
分享
地板 | 返回顶端
阅读会员资料 发送站内短信 主题 User photo gallery 礼物  
 
回复主题     |##| -> |=|     论坛首页 -> IT人生 所有的时间均为 美国太平洋时间
1页,共1


注:
  • 以上论坛所有发言仅代表发帖者个人观点, 并不代表本站观点或立场, 加西网对此不负任何责任。
  • 投资理财及买房卖房版面的帖子不构成投资建议。投资有风险,责任请自负
  • 对二手买卖中的虚假信息,买卖中的纠纷等均与本站无关。
  • 黄页热门商家 免费个人广告
    发布商业广告

    不能在本论坛发表新主题
    不能在本论坛回复主题
    不能在本论坛编辑自己的文章
    不能在本论坛删除自己的文章
    不能在本论坛发表投票
    不能在这个论坛添加附件
    可以在这个论坛下载文件

    论坛转跳: 

    webdriver, Castro, nessus, 飞舞的音符
    潜力帖子 精华帖子 热门帖子
    错过这次千载难逢的买房机会的人太多了
    金家王朝应该感谢东大和毛子国。
    俄罗斯强硬表态:若美攻伊,俄必参战!
    丑大了 伊朗防空设备原来made in china
    中国国庆阅兵
    特朗普:如果有人想让中国加入G7,...
    参战了
    猜猜猜 BMO又开始来吓唬人了 准备套...
    台湾97岁老人因欠巨额房租被告,法...
    哈梅内伊仓促发表演讲:“不跪”!...
    担心的不是美国参战,而是美国不参战!
    地狱之门打开?伊朗版东风26首战告捷
    刀砍对凌迟
    印度人的单纯和快乐
    紧急突发,北京上空罕见军演?台湾...
    “五到八年后再看,疫情后的2023年...
    又看完一部电视剧
    新疆伊犁 赛里木湖 三大草原恰西 喀...
    新疆阿勒泰 五彩滩 喀纳斯 魔鬼城
    在乌鲁木齐看娘娘骑过的汗血宝马
    一张天主教在华发行纸钞略考
    5月2日换币盛况
    维达大师,另类收藏,请您欣赏!
    清代福州台伏钞票
    四川官钱局钞票
    大汉四川军政府军用银票
    今年新币发行计划
    要出一个新的一元
    古董金币
    mint三月新币(四月新币从22楼起,五...
    超级重磅!加拿大要进口中国电动车!
    皮尔今天在温哥华 - 蓝色wave - 保...
    几分钟前,中国强硬反击,征34+50,...
    曼谷高楼直接倒了
    我说我希望特朗普赢,老公气得眼睛...
    知乎?加西网上为什么有老男人喜欢...
    明明有能力统台,大陆为何迟迟不动手?
    貌似ndp稍占上风。。。。。
    今天是感恩节,跟大家道个别,以后...
    咱最后还是投了ndp
    生平第一次被偷车了
    中国会不会武统台湾
    突发:台湾队战胜中国队奥运夺冠,...
    温哥华房姐出事了
    有在看总统辩论的吗?

    最新新闻 热门新闻 热评新闻
    "世界上最安全城市"被伊导弹击中 国际震惊
    朝鲜同款导弹袭击以色列, 同时参与2场反美战
    马斯克再发药检结果,意外泄露"私人信息"
    因为染了粉色头发,名校女孩被审判致死
    洛杉矶组织发钱,让小贩暂停摆摊避免ICE突袭
    以军那么厉害 为什么还要美国出手
    禁令之下,黄仁勋再用阉割芯片抢夺中国市场
    在中英两国迷奸至少10人,中国留学生被判终身监禁
    以伊战争成"烧钱黑洞" 以色列1天花好几亿美元
    川普最痛恨伊朗 美国会重新掉入中东泥沼吗
    哈梅尼孙女在美留学 伊朗一半人是外国的眼线
    细节披露:伊朗9名核科学家睡觉时被暗杀
    分鸡腿又翻车?朱丹因"重男轻女"言论道歉
    单身多年!44岁前港姐曾被父亲指没人要....
    浏阳花炮往事:从驱鬼物到娱乐品,千年炼成....
    全球最新排名 加拿大大学全面碾压美国
    搭帐篷 BC公寓业主和物业闹上法庭
    乌克兰母亲入境以色列为女求医 命丧伊朗攻击
    多伦多华人Dollarma糟心经历:被收"三倍钱"
    中国在以色列民众不满撤离工作
    海昏侯"在位27天做千件坏事"?曝被废真相
    50万一台的人形机器人进厂,搬运效率低到不忍看
    突发!班夫公园岩石滑坡 多人死伤
    金星金字塔城市被确认 曾是智慧生命的家园?
    再见了"镀金",留学已经进入硬通货时代
    清华惊现"神秘高科技组织" 为啥学生都戴"神奇发帽"?
    "跪坐"客人身上 广东发廊洗头影片爆红 网炸锅
    威慑北京至关重要时刻降临!华日:川普不可仁慈
    川普点头了?以总理:不排除"斩首"哈梅内伊
    以伊互攻下 伊朗外长和美方保持接触
    继医疗危机后 BC教育系统陷入危机
    "他们很懂伊朗",川普首次会见一位"业内高手"
    应对伊朗危机 川普依赖低调四人组 排除她和他
    遗憾 列治文经营18年著名饼屋关闭
    传张又侠军委扩大会议讲话摘要 向习开炮
    金灿荣:中国网民嘲笑伊朗"又怂又菜"?!
    温哥华暴力犯罪率降至20年来最低
    BC停止资助9岁绝症女孩 家长不满
    普京亲自解释:不是不帮伊朗 而是伊朗没求援
    以防长称"接获指示"让哈梅内伊消失 总理表态
    传齐心邀胡温等5元老赴家宴 规劝习8月底退位
    加国未来10年需建造480万套新房
    习王不同调:关键时刻,中南海怂了
    又急又怕:伊朗政权临崩 北京一天一变
    威慑北京至关重要时刻降临!华日:川普不可仁慈

    更多方式阅读论坛:

    Android: 加西网
    [下载]

    Android: 温哥华论坛
    [下载]

    PDA版本: 论坛

    加西网微信

    加西网微博


    Powered by phpBB 2.0.8
    Terms & Conditions    Privacy Policy    Political ADs    Activities Agreement    Contact Us    Sitemap    

    加西网为北美中文网传媒集团旗下网站

    页面生成: 0.0487 秒 and 5 DB Queries in 0.0016 秒