用C++/CLI搭建C++和C#之间的桥梁(三)—— 基本类型

数值类型

对于基本的数值类型,在C++/CLI中是可以直接映射为托管类型的数值的,可以同时应用于托管类型和非托管类型,编译器会将其自动转换。


基本类型


System命名空间中对应的类


注释/用法


bool


System::Boolean


bool dirty = false;


char


System::SByte


char sp = ‘ ‘;


signed char


System::SByte


signed char ch = -1;


unsigned char


System::Byte


unsigned char ch = ‘\0‘;


wchar_t


System::Char


wchar_t wch = ch;


short


System::Int16


short s = ch;


unsigned short


System::UInt16


unsigned short s = 0xffff;


int


System::Int32


int ival = s;


unsigned int


System::UInt32


unsigned int ui = 0xffffffff;


long


System::Int32


long lval = ival;


unsigned long


System::UInt32


unsigned long ul = ui;


long long


System::Int64


long long etime = ui;


unsigned long long


System::UInt64


unsigned long long mtime = etime;


float


System::Single


float f = 3.14f;


double


System::Double


double d = 3.14159;


long double


System::Double


long double d = 3.14159L;

字符串

字符串CLI已经内置了:System::String,但C++的常用字符串有char*、wchar_t*、std::string等好多种,编译器提供了char*、wchar_t*到System::String的自动转换:

System::String^ s = "hello worold";
    System::String^ s2 = L"hello worold";

另外,也可以使用gcnew创建托管字符串:

System::String^ s = gcnew
String("hello worold");

但是,对于System::String转char*,系统没有直接的语法支持。方法有很多种,我通常使用如下方式来转换:

IntPtr ip = Marshal::StringToHGlobalAnsi(str);
    const
char* ch = static_cast<const
char*>(ip.ToPointer());
    //do something with ch
    Marshal::FreeHGlobal(ip);

这里有个需要注意的地方是在使用完转换出来的const char*后需要释放掉转换过程中的Intptr,如果没有太多需要考虑性能的地方,大可以使用一个std::string将其拷贝走,写成如下函数形式:

    #include <string>

    using namespace std;
    using namespace System;
    using namespace System::Runtime::InteropServices;

    string cast_to_string(String^ str)
    {
        IntPtr ip = Marshal::StringToHGlobalAnsi(str);
        const char* ch = static_cast<const char*>(ip.ToPointer());
        string stdStr = ch;
        Marshal::FreeHGlobal(ip);

        return stdStr;
    }

参考文章:如何:使用 C++ 互操作封送 ANSI 字符串

时间: 2024-12-16 12:49:11

用C++/CLI搭建C++和C#之间的桥梁(三)—— 基本类型的相关文章

用C++/CLI搭建C++和C#之间的桥梁(一)

C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统.C++则具有底层API的访问能力和拔尖的执行效率,往往用于访问底层模块和构建有性能要求的算法. 这两种场景看起来有较大的差异,大多数的时候可以各行其道.但还是有很多时候会出现融合的情况.当我们构建分布式系统的时候,由于RPC机制一般都是语言无关的,我们大可以将其各尽所长,按需划分在最能发挥其长处的位置.然而,一旦我们需要构建融合两者需求的集中式系统的时候,就会头痛无比.

用C++/CLI搭建C++和C#之间的桥梁(四)—— 网络资源

关于C++/CLI的基础,我前面已经写过了几篇文章介绍过一些了,不过这些基本上都是管中窥豹,如果要详细了解C++/CLI,MSDN无疑是最好的教程. 使用 C++ 互操作(隐式 PInvoke) Visual C++ 中的 .NET 编程 后面有空的话,我会继续继续相关的一些介绍文章的.

用C++/CLI搭建C++和C#之间的桥梁(二)—— 基本语法

托管对象的创建和引用 在前文中我们已经演示过创建一个托管对象,对于如下C#代码: System.Object x = new System.Object(); 其在C++/CLI中的等价代码如下: System::Object^ x = gcnew System::Object(); 和传统的C++创建的语法比较下, P* x = new P(); 我们不难发现,对于托管对象,主要引入了如下两个语法: 用gcnew代替new实现托管对象的创建 用^代替*实现托管对象的指针 这种方式创建的对象是可

vue cli搭建项目及文件引入

cli搭建方法:需安装nodejs先 1.npm install -g cnpm --registry=https://registry.npm.taobao.org //安装cnpm,用cnpm下载东西有时会快一些 2.cnpm i -g vue-cli  //安装 vue-cli,i:install 安装,-g:全局,哪儿都可以使用. 3.vue init webpack-simple ProjectName //webpack-simple:使用webpack-simple模板,proje

Vue Cli搭建域名服务器常见问题

Vue Cli搭建域名服务器常见问题 Vue Cli不使用反向代理配置域名 通过npm run serve命令执行Vue项目只能通过IP地址来访问,即使域名服务中设置DNS依然访问不到.有以下三种解决办法: 1.修改项目根目录下[email protected]\cli-service\lib\options.js文件 //第133行 devServer: { /* open: process.platform === 'darwin', host: '0.0.0.0',//改为域名 port:

搭建高可用mongodb集群(三)—— 深入副本集内部机制

http://www.lanceyan.com/tech/mongodb_repset2.html 在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会

手把手教你搭建LyncServer2013之Lync后端存储准备(三)

这次实验的Lync后端存储安装的是SQL Server 2012,配置了高可用,两台做Mirror,一台做见证服务器,实现故障的自动转移,SQL Server的安装需要.net Framwork 3.5的支持,所以在安装SQL之前,我们先来安装.net Framework 3.5 安装完.net Framework 3.5后,我们开始第一台SQL Server 2012的安装 到此第一台Lync后端存储服务器已经安装好,因为我这次实验中需要安装监控和存档角色,所以在安装数据库的时候选择了三个功能

博客园客户端UAP开发随笔 -- 搭建App之间的桥梁

开发Windows Phone应用的同学们应该都注意到了,Windows Phone 为了安全性,对应用的限制还是比较多的.我记得一位360的同学很无奈的说:WP太安全了,我们这些做WP上360卫士的基本上没啥可做的.但是当WP360那个App出来后,还是有很多用户安装了呢,尽管真的对安全没什么太大的帮助,但是对用户了解自己的手机的使用情况还是有帮助的.其中一位用户的评价是:从android到PC,我一直用360, 所以在WP上我也用.呵呵,粉丝啊!具体有什么用其实他也不关心铁粉而已. 扯远了!

vue cli搭建的vue项目 不小心开了eslint 一直报黄色的警告

报错必须处理,警告也忍不了,发现在bulid -webpack.base.config.js 里找到 const createLintingRule = () => ({ /*test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter