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

匿名 (未验证) 提交于 2019-12-02 22:06:11

导航

  

  

    

    

    

  

    

    

    

    

  

    

    

  

    

    

    

    

    

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.接口中定义:

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; 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!