当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++/CLI的用途

C++/CLI的用途

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:348

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

 

    关键字:

天才代写-代写联系方式