用C++/CLI與Unmanaged 程式碼互動比用C#方便多了

來源:互聯網
上載者:User
  沒有使用C++/CLI之前,我很懷疑它存在的意義.因為C#的文法更清爽,運行效率也不比C++差多少.C++本身就很複雜了,再乘以CLI的複雜度,我不能想出人們為什麼會學習它,使用它.
  但是在使用C#的過程中,漸漸發現.Net類庫不夠豐富,有很多功能必須通過P/Invoke來實現.一般常用的Windows API函數還好說,介面通常比較簡單,DllImport + IntPtr已經足夠了,而且還有www.pinvoke.net這個很大的資產庫,使用起來還是相當方便的. 雖然有時看到那個日漸龐大的NativeMethods類不爽,但是整體來說,能解決問題.
  等到我必須使用第三方C/C++類庫時,我發現使用C#與它們互動實在太痛苦了.普通的對整型數的指標,引用這些好說,但是一碰到複雜的(尤其是嵌套的)資料結構,我就發現自己面對著成百上千行的.h不想動手--天哪,我只想調用一個函數,為什麼要用C#重寫這麼些複雜的struct定義?就連最簡單最常用的byte[],在託管與Unmanaged 程式碼間傳遞也要大耗周折.
  在這兩天使用Intel JPEG Library(ijl15.dll)時,我終於忍受不了了,於是想到用C++封裝一下對它的調用,簡化一下傳入傳出的參數.完成後,對著那個20K的原生dll,想著我還得在C#裡弄DllImport之類的東西,終於覺悟了:幹嗎不用C++/CLI? 雖然對它的瞭解不是很深(只在05年看過Stan Lippman在<<程式員>>上發表的兩篇文章),但是實際做起來真的很爽!
  一個pin_ptr關鍵字,直接抹去了託管與非託管之間的邊界;而且居然能用CopyMemory從原生unsigned char*裡往System.Byte[]裡拷貝內容!我的天!原來就算像我這樣瞭解得這麼少的人,也能從C++/CLI裡獲得這麼大的好處!
  以前因為沒有.Net版本而放棄的類庫,現在我都可以拿來用了.直到現在我才明白,錯過C++/CLI的這些日子裡,我錯過了多少東西.

附,有C#及C++背景的人使用C++/CLI的必備知識:

1, C++/CLI裡的new等於C++裡的new, gcnew等於C#裡的new
2, 原生指標用*表示,託管引用使用^表示
   如: Stream^ stream = gcnew Stream();
3, array<unsigned char>^ 等於 System.Byte[]
4, pin_ptr關鍵字能把託管引用轉換為原生指標:
   如: pin_ptr<BYTE> pBytes = & byteArray[0];
   然後pBytes就可以當作原生的BYTE* 使用了.
   等代碼執行完pBytes的有效範圍,byteArray就會恢複可被GC處理的狀態.

只需要知道簡單的這幾點,就可以開始獲得C++/CLI帶來的巨大便利了!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.