C++/CLI的用途

來源:互聯網
上載者:User

作為一個有著正常審美觀的人,我簡直無法忍受C++/CLI(以及managed c++)的醜陋。不 過,近來發現,這個醜東西也還有點用,在把原生開發介面封裝成託管開發介面時,比C#的 互操作容易的多(互操作看了看,頭大呀)。磕磕絆絆幾天,終於把一個SDK開發包轉換完成 了。總結經驗如下:

1. 對於clr中的參考型別,定義變數時要用個^符,如"String^ var1"、 "array<int>^ var2"、"array<String^>^ strarr"等, 實值型別不用。一個類型是實值型別還是參考型別,取決於定義時用的是value struct/class還 是ref struct/class。

2. 定義枚舉要用enum struct/class, 否則是個原生枚舉,C#裡不能用。可指定數實值型別 和flags屬性,如下:

[FlagsAttribute]
public enum class TestEnum : unsigned int
{
 flag1 = 0x00000001,
 flag2 = 0x00000002,
};

3. 原生字串轉換為託管字串時,用:

char* s1 = "native string1";
wchar_t* s2 = L"native string2";
String^ str1 = gcnew String( s1 );
String^ str2 = gcnew String( s2 );

託管字串轉換為原生字串時,用:

pin_ptr<const wchar_t> p = PtrToStringChars( str );

如果需要ansi字元集,可再對p進行一些常規字元集轉換。

4. 指標、控制代碼等與0進行賦值比較等操作時用nullptr,而不是NULL或0,後者會導致裝箱 等操作,如:

HANDLE h = nullptr;
if( h == nullptr ){}

5. C#中定義函數參數時的ref關鍵字在C++/CLI中用%號對應,如:

void foo( String^% refstr );

out關鍵字,需要用[System::Runtime::InteropServices::OutAttribute]聲明一下。

6. 數組空間初始化,用()而不是[],也就是說它是一個函數調用,如

array<int>^ arr = gcnew array<int>(100);

的作用是定義一個有100個元素的數組。

7. C++/CLI中很多地方不能用const、volatile等關鍵字,如果編譯報錯,就把它們去掉 吧。

8. 盡量不要定義自己的DllMain,如果必須定義的話,DllMain中不要進行任何託管操作 ,否則極易導致死結。可以"#pragma managed"編譯指令,臨時開啟或關閉託管。

9. 暫時沒有了,等想起來再補充。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.