| 廣告聯系 | 簡體版 | 手機版 | 微信 | 微博 | 搜索:
歡迎您 游客 | 登錄 | 免費注冊 | 忘記了密碼 | 社交賬號注冊或登錄

首頁

新聞資訊

論壇

溫哥華地產

大溫餐館點評

溫哥華汽車

溫哥華教育

黃頁/二手

旅游
搜索:  

 論壇通告:  轉載新聞請務必注明出處,這些媒體請不要轉,謝謝   請不要上傳第三方有版權的照片,請尊重版權,謝謝   批評商家需要注意  
 個人空間: XY | 血流成河 | 忽然聽到一個墨西哥女仔唱。呐呐呐呐呐呢呐 | 我在溫哥華 | 亂想 | 客觀中立而實事求是,唯服理據而杜絕辱罵 | 羅蓬特機器人 | 快樂的獅子 | 國際貨運海運(家具設備食品材料貨品) | 我大爺 | 白龍王許道長 | 顧曉軍 | nessus | 我的退休生活 | 星空 | 大溫房產和地產研究 | 花隨風 | 湖裡湖塗 | 呂洪來的個人空間 | 滄海一聲笑
 最新求助: 請問誰知道哪裡有賣理發的電動推子?   忽然有個疑問:戰爭時期,加拿大拿PR卡未入籍的永久居民會被強制服兵役嗎?   這個銀條   如何修改會員名?
 論壇轉跳:
     發帖回帖獲取加西鎊, 兌換精彩禮物

論壇首頁 -> IT人生

ZT: .NET Interop入門-P/Invoke和Reverse P/Invoke (發表於15年前)



回復主題  圖片幻燈展示  增添帖子到書簽中  給帖子中的發貼者批量贈送獻花或者花籃    |##| -> |=|        發表新主題
閱讀上一個主題 :: 閱讀下一個主題  
作者 正文
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, 飛舞的音符
    潛力帖子 精華帖子 熱門帖子
    多房暴負:素裡鎮屋賠好慘
    有小溪的大地舊屋為啥便宜?
    要相信常識
    tiktok要被禁止了
    2024APR24 俄國戰場上得勢,靠的是中國
    4月24日,海南澄邁。有網友發現三個...
    今年驗血報告出爐
    及時行樂
    感覺加西網論壇已經進入垃圾時間
    為什麼又有好多僵屍貼
    保護人和車子,遠離工地
    大家餐廳吃飯會用開水燙碗筷嗎?
    為什麼中國歷史不斷輪回
    今天去抽血
    為什麼加拿大有這麼多的老鼠
    The Value of Money
    再去chief peak
    這些是不是真貨?
    同號雷達鈔
    今天包粽子 兼和粉紅吵架
    熱烈恭賀錢幣小站新任版主四季豆同學
    北溫換硬幣活動取消
    加拿大唯一無國籍的硬幣
    每周版主推薦,美女精選(二七二)
    美國印第安人1元卷今日發貨
    每周版主推薦,美女精選(二七一)
    電視劇繁花觀後感之阿寶到底喜歡哪...
    每周版主推薦,美女精選(二七零)
    2024 雪中即景
    每周版主推薦,美女精選(二六九)
    在北美得了大病真是只能等死了
    國內最驕傲的兩件事外賣和快遞
    烏克蘭已經花掉了美國七百多億美元
    大家如何看待北京同仁堂汞超標5萬倍...
    身在海外,痛罵國內人不反抗挺壞的
    95個小時,這是看急診嗎
    疫情4年後,海外華人去中國的觀感
    在加做房東有罪嗎?
    坎昆比夏威夷好玩
    中國沒有恐襲
    BC省長宣布:BC將實行永久夏令時 但...
    臥槽 太貴了
    你們回國有很安全的感覺嗎
    除了中國,還有第二個國家買火車票...
    請問為啥Tylor Swift這麼火啊?

    最新新聞 熱門新聞 熱評新聞
    震驚:長沙14歲女生遭霸凌,被迫割喉求生(圖)
    布林肯到上海豫園吃南翔小籠包 或見習為拜登鋪路(圖)
    證實在華大裁員 華為“最大對手”日子不好過(圖)
    不道德 數千人要求BC醫院免費停車
    “哈命貴”占領美國大學——死給你看(圖)
    溫村98年老宅以高於要價90萬售出
    6月份降息?加國央行內部有分歧
    太誇張 房東試圖出租床的一半被批
    中國欲反擊美制裁 但不得不克制 因為…(圖)
    壕!古董車吊上溫哥華豪華公寓大樓
    中國房地產泡沫早有警訊,為什麼沒人踩刹車?(圖)
    美宣布對烏追加10億美元軍援 將在數小時內開始運送(圖)
    美眾議院對華鷹派戰略受質疑(圖)
    父母能獨立在希臘生活,讓我覺得人生沒有上限(圖)
    選前福利?白宮考慮為美國公民的移民配偶提供移民救助
    挺巴民眾包圍參院領袖家 市長被罵
    暴力撬門盜竊 溫村華裔一家很不安
    加州隨機殺人 刀刺女喉嚨噴血慘死
    以色列襲黎巴嫩真主黨40據點 殲滅
    官員下田攔春耕 農民種地要先交錢?
    高學歷內卷 殯儀館新聘3名火化工
    拜登簽署TikTok“不賣就禁”法案
    越南民眾呼吁全民公投 10人被判刑
    荷蘭芯片巨商新CEO上任 首要關注
    恐怖 大溫這才刺傷人又有人被刺死
    高強度外交 中美關系的最新信號
    烏軍防線被突破 每天損失2個營 “最多撐兩月”(圖)
    中央財經大學教授實地觀察美國經濟:內需強工作好找
    德國多發中國間諜案 朔爾茲罕見一連用3個"非常"
    歐盟對中國醫療器械市場啟動調查 中國批評
    列治文商場特斯拉著火 到底咋回事
    特魯多官宣發錢,民眾卻心碎失望
    封禁TikTok議案 美參院朝終點邁進
    飄忽不定、服務政治 中國統計的法律與兒戲
    6月份降息?加國央行內部有分歧
    北美最大夜市-列治文夜市周五開幕
    拜登簽署TikTok“不賣就禁”法案
    高學歷內卷 殯儀館新聘3名火化工
    官員下田攔春耕 農民種地要先交錢?
    以色列襲黎巴嫩真主黨40據點 殲滅
    加州隨機殺人 刀刺女喉嚨噴血慘死
    挺巴民眾包圍參院領袖家 市長被罵
    越南民眾呼吁全民公投 10人被判刑
    布林肯抵達上海 胡錫進:這次應當屬於“懇求之旅”(圖)
    荷蘭芯片巨商新CEO上任 首要關注

    更多方式閱讀論壇:

    Android: 加西網
    [下載]

    Android: 溫哥華論壇
    [下載]

    PDA版本: 論壇

    加西網微信

    加西網微博


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

    加西網為北美中文網傳媒集團旗下網站

    頁面生成: 0.0499 秒 and 5 DB Queries in 0.0013 秒