快速业务通道

C++/CLI的用途

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号