計(jì)算機(jī)二級C++輔導(dǎo):C++/CLI的用途

字號:

作為一個(gè)有著正常審美觀的人,我簡直無法忍受C++/CLI(以及managed c++)的丑陋。不過,近來發(fā)現(xiàn),這個(gè)丑東西也還有點(diǎn)用,在把原生開發(fā)接口包裝成托管開發(fā)接口時(shí),比C#的互操作容易的多(互操作看了看,頭大呀)??目慕O絆幾天,終于把一個(gè)SDK開發(fā)包轉(zhuǎn)換完成了??偨Y(jié)經(jīng)驗(yàn)如下:
    1. 對于clr中的引用類型,定義變量時(shí)要用個(gè)^符,如"String^ var1"、"array^ var2"、"array^ strarr"等,值類型不用。一個(gè)類型是值類型還是引用類型,取決于定義時(shí)用的是value struct/class還是ref struct/class。
    2. 定義枚舉要用enum struct/class, 否則是個(gè)原生枚舉,C#里不能用??芍付〝?shù)值類型和flags屬性,如下:
    [FlagsAttribute]
    public enum class TestEnum : unsigned int
    {
    flag1 = 0x00000001,
    flag2 = 0x00000002,
    };
    3. 原生字符串轉(zhuǎn)換為托管字符串時(shí),用:
    char* s1 = "native string1";
    wchar_t* s2 = L"native string2";
    String^ str1 = gcnew String( s1 );
    String^ str2 = gcnew String( s2 );
    托管字符串轉(zhuǎn)換為原生字符串時(shí),用:
    pin_ptr p = PtrToStringChars( str );
    如果需要ansi字符集,可再對p進(jìn)行一些常規(guī)字符集轉(zhuǎn)換。
    4. 指針、句柄等與0進(jìn)行賦值比較等操作時(shí)用nullptr,而不是NULL或0,后者會導(dǎo)致裝箱等操作,如:
    HANDLE h = nullptr;
    if( h == nullptr ){}
    5. C#中定義函數(shù)參數(shù)時(shí)的ref關(guān)鍵字在C++/CLI中用%號對應(yīng),如:
    void foo( String^% refstr );
    out關(guān)鍵字,需要用[System::Runtime::InteropServices::OutAttribute]聲明一下。
    6. 數(shù)組空間初始化,用()而不是[],也就是說它是一個(gè)函數(shù)調(diào)用,如
    array^ arr = gcnew array(100);
    的作用是定義一個(gè)有100個(gè)元素的數(shù)組。
    7. C++/CLI中很多地方不能用const、volatile等關(guān)鍵字,如果編譯報(bào)錯,就把它們?nèi)サ舭伞?BR>    8. 盡量不要定義自己的DllMain,如果必須定義的話,DllMain中不要進(jìn)行任何托管操作,否則極易導(dǎo)致死鎖??梢?#pragma managed"編譯指令,臨時(shí)打開或關(guān)閉托管。
    9. 暫時(shí)沒有了,等想起來再補(bǔ)充。