C++/CLI的用途

转自:http://dev.21tx.com/2009/04/17/13913.html

作为一个有着正常审美观的人,我简直无法忍受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. 暂时没有了,等想起来再补充。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值