本文共 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/