沒有使用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#裡的new2、原生指標用*表示,託管引用使用^表示如: 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帶來的巨大便利了!
其它C++/CLI知識參考:http://www.cppblog.com/golq/category/11113.html