当前位置: 移动技术网 > IT编程>开发语言>.net > C#调用C++(QT5.5.1项目)的C++/CLI(CLR项目)项目技术笔记

C#调用C++(QT5.5.1项目)的C++/CLI(CLR项目)项目技术笔记

2019年03月13日  | 移动技术网IT编程  | 我要评论

导航

  

  

    

    

    

  3.clr中各种定义

    

    

    

    

  4.clr中各种使用

    

    

  5.clr中数据类型的转换

    1.string ^ 到 qstring 的转换

    2.qstring 到 string ^ 的转换

    3.char * 到 string ^

    4.wchar_t * 到 string ^

    

1.编译环境

系统:windows10

环境:vs2010 + qt5.5.1

2.项目配置

1.设置附加包含目录

1.此项设置包含的头文件,需要填入用到的.h文件目录

2.下图中的qtdir是qt5.5.1安装目录环境变量(默认路径:c:\qt\qt5.5.1\5.5\msvc2010)

 

2.设置附加库目录

1.此项设置引用的lib目录,如下图。

 

3.设置附加依赖项

1.此处设置指定的lib文件,一般不用填写。

 

3.clr中各种定义

1.接口定义

 

 

2.类定义

 

3.枚举定义

 

4.属性定义

1.接口中定义:

 2.类中定义:

 

4.clr中各种使用

1.类的实例化

所有.net对象都需要使用gcnew进行创建,gcnew创建的对象不需要自己手动释放内存。

gtable ^ ret = gcnew gtable();

2.命名空间的使用

命名空间用于限定类,不同于c#,这里使用::进行分割。

virtual mynamespace::itable ^ gettable(int index);

5.clr中数据类型的转换

1.string ^ 到 qstring 的转换

qstring marshalstring(string ^ s)
{
	using namespace runtime::interopservices;
	const char* chars =
		(const char*)(marshal::stringtohglobalansi(s)).topointer();
	string str = chars;
	qstring ret = str.c_str();
	marshal::freehglobal(intptr((void*)chars));
	return ret;
}

  

2.qstring 到 string ^ 的转换

string ^ marshalstringlocal8(qstring os)
{
	using namespace runtime::interopservices;
	if (os.isnull()) return nullptr;
	qbytearray data = os.tolocal8bit();
	char * str = new char[data.length() + 1];
	strcpy_s(str, data.length() + 1, data.constdata());
	string ^ ret = marshal::ptrtostringansi(static_cast<intptr>(str));
	delete str;
	return ret;
}

 

string ^ marshalstring(qstring os)
{
	using namespace runtime::interopservices;
	qbytearray data = os.toutf8();
	char * str = new char[data.length() + 1];
	strcpy_s(str, data.length() + 1, data.constdata());
	string ^ ret = marshal::ptrtostringansi(static_cast<intptr>(str));
	delete str;
	return ret;
}

 

3.char * 到 string ^

string ^ marshalstring(char* os) {
	using namespace runtime::interopservices;
	string ^ ret = marshal::ptrtostringansi(static_cast<intptr>(os));
	return ret;
}

 

4.wchar_t * 到 string ^

string ^ marshalstring(wchar_t* os) {
	using namespace runtime::interopservices;
	string ^ ret = marshal::ptrtostringuni((intptr)os);
	return ret;
}

 

5.数组的转换

using namespace system::runtime::interopservices;
qbytearray bytearray = obj.tobytearray();
int length = bytearray.count();
array<byte> ^ rbytearray = gcnew array<byte>(length + 2);
marshal::copy((intptr)bytearray.data(), rbytearray, 0, length);
ret = rbytearray;

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网