博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
托管c++与c#的转换一
阅读量:4091 次
发布时间:2019-05-25

本文共 1737 字,大约阅读时间需要 5 分钟。

上一篇,我们介绍了c#与托管c++,原生c++的安装,联合编译,调用。但现在还有一个很大的问题,使用c#调用托管c++时,c++中原有的值类型char,int ,long,float,bool还好说。但std:string,vector,void*,int*,const char*,struct&...等等类型却不好操作,现在做进一步的讲解。

一、c++中的const char*,std:string,与托管c++String^的相互转换

     你希望c#中调用某个原 c++函数:ReadAllQuertData(const char* pBatchName)。由于c#中没有char*类型,我们使用托管c++来进行一层封装,托管c++可以直接调用原生c++的代码,下面是托管c++中一个函数,引用命名空间:

#include <string.h>

#include <msclr\marshal_cppstd.h>
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;

对原生的c++函数进行包装:

        ReadAllQuertData_CLR(String^ pBatchName)

             {

                      char* temp=(char*)(void*)Marshal::StringToHGlobalAnsi(pBatchName);

                      ReadAllQuertData(temp);     //原生的c++函数 

             }

重新编译下,C#就完成调用c++的ReadAllQuertData函数

       在c#中,动态链接库中会显示成  : ReadAllQuertData_CLR(string pBatchName)。它可以直接被c#调用。

char*  转换为 String^:     (char*)(void*)Marshal::StringToHGlobalAnsi(pBatchName);

std:string 转为String^  :   marshal_as<String^>(str_BatchNumber.c_str());

                                     String^ name=gcnew String(tempStrName.c_str());

String^转为std:string   :  

                                     marshal_as<std::string>(info->str_HostID->ToString())   或者

                                      (char*)(void*)Marshal::StringToHGlobalAnsi(pBatchName);//char*隐式转为string

                           (const char*)(Marshal::StringToHGlobalAnsi(DataIn[j]->paramName)).ToPointer();

 

二、对于int&,unsigned long long&,int*,float*等值类型的引用变量,可以使用%来包装,例如:原生c++ 中有

    bool GetOutTotalCount(unsigned long long& nCount);

在托管c++中,可以写成

  bool GetOutTotalCount_CLR(unsigned long long% nCount)

     {

                unsigned long long temp = 0;

                nCount = temp;

               GetOutTotalCount( nCount);

     }

对于原生c++的GetData(unsigned long long* nCount)

托管c++中,这样写

GetData_CLR(unsigned long long% nCount)

      {

               unsigned long long temp = 0;

                nCount = temp;

               GetData( &nCount);

      }

编译生成后c#中, GetOutTotalCount_CLR(ref unsigned long long nCount);

                               GetData_CLR(ref  unsigned long long nCount)

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://jviii.baihongyu.com/

你可能感兴趣的文章
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
线性数据结构学习笔记
查看>>