C++/CLI的用途

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

时间: 2024-08-30 14:36:00

C++/CLI的用途的相关文章

PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkPHP框架(3.2) Redis数据库:测试数据回调函数:通过一个Redis的自增incr来测试异步脚本执行的次数和访问的时间(平时都是用Redis测试写日志的) 编辑器:Visual Studio Code (CLI运行环境好看点) PHP 的命令行模式       从版本 4.3.0 开始,PHP

CLI+Terraform简化资源管理的模板编写

Terraform是一个比较强大的自动化资源编排管理工具,通过模板描述资源,通过apply命令创建/更新资源.详细的使用方法及特性可以参见公众号中关于Terraform的其他文章了解.本文将主要讲解如何利用CLI+Terraform简化模板的编写. Terraform的模板由几大结构组成:资源(resource).变量(variable).输出(output),他还有一个很重量级的结构:数据源(data).数据源是用来过滤资源中parameter的可选项的,举个例子,ECS的实例类型(insta

使用 Apache Commons CLI 开发命令行工具示例

概念说明 Apache Commons CLI 简介         Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能.     Apache Commons CLI 支持多种输入参数格式,主要支持的格式有以下几种: POSIX(Portable Operating System Interface of Unix)中的参数形式,例如 tar -zxvf foo.tar.gz GNU 中的长参数形式,例如 du

Windows 2003活动目录管理之拆分双用途域控制器

最近我有几个关于划分具双用途域控制器的问题.大多问题都是这样,"我在一家小公司做事, 几年前把所用的电脑升级到Windows 2000,但买不起两个服务器.因此,我们为公司部署了一个域.同时 ,将域服务作为主机系统.现在我们想划分这个具双用途的域控制器,以便让每个系统拥有自己的功能. 那么如何在不丢失数据的情况下,将其转变到两个新服务器上?" 方法很简单.Windows 2000 Server(以及Windows Server 2003)中所有的域控制器都是同位体.了 解了这一点,解决

Hive CLI

bin/hive –help Usage ./hive <parameters> –service serviceName <service parameters> Service List: cli help hiveserver hwi jar lineage metastore rcfilecat(Hive支持的service) 对于某个具体的服务,要获取帮助的话,可以: hive –help –service cli hive中的变量和属性有这样四个名字空间:hivevar

.NET/CLI元数据中使用的压缩整数

简单来说,整数压缩算法就是将一个32位整数(通常占用4个字节)放置到尽可能少的存储空间中(1 .2或4个字节)的方法. 整数压缩算法广泛地应用在.NET/CLI PE文件中,如各种元数据签名. #Blob和#US流等.在这些地方,需要使用整数值来记录条目的数量或是数据块的大小等.如果单纯地采用 32位整数,由于绝大多数数量值或大小值都不大,会造成大量字节都被置为无意义的0值.在这些场景中 使用压缩算法,可以有效地节省PE文件占用的磁盘空间或网络带宽. 以下是PE文件中一些使用到 压缩整数的场景:

源码-购物网站数据设计(仅作为自己学习用,无任何商业用途)

问题描述 购物网站数据设计(仅作为自己学习用,无任何商业用途) 我想做一个购物网站的项目,对于数据库设计方面比较苦恼,求大神提供一份购物网站数据库设计方案和源码(仅作为自己学习用,无任何商业用途) 解决方案 http://bbs.csdn.net/topics/390963719 我上传了上百个,你一次性下载下来慢慢研究. 解决方案二: http://download.csdn.net/detail/ai240312710/2499833http://download.csdn.net/deta

js闭包的用途

我们来看看闭包的用途.事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1 匿名自执行函数 我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处, 比如:别的函数可能误用这些变量:造成全局对象过于庞大,影响访问速度(因为变量的取值是需要从原型链上遍历的). 除了每次使用变量都是用var关键字外,我们在实际情况下经常遇到这样一种情况,即有的函数只需要执行一

名词解释:什么是XSL,它有什么用途

XSL 之于 XML 就像 CSS 之于 HTML.它是指可扩展样式表语言 (EXtensible Stylesheet Language).这是一种用于以可读格式呈现 XML 数据的语言.XSL 实际上包含两个部分: * XSLT – 用于转换 XML 文档的语言 * XPath – 用于在 XML 文档中导航的语言 XSLT 是指 XSL 转换 (XSL Transformation),它是 XSL 最重要的部分. XSLT 可以将 XML 文档转换为其它 XML 文档.XHTML 输出或简