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

时间:2022-09-01 18:32:44

导航

  1.编译环境

  2.项目配置

    1.设置附加包含目录

    2.设置附加库目录

    3.设置附加依赖项

  3.CLR中各种定义

    1.接口定义

    2.类定义

    3.枚举定义

    4.属性定义

  4.CLR中各种使用

    1.类的实例化

    2.命名空间的使用

  5.CLR中数据类型的转换

    1.String ^ 到 QString 的转换

    2.QString 到 String ^ 的转换

    3.char * 到 String ^

    4.wchar_t * 到 String ^

    5.数组的转换

1.编译环境

系统:windows10

环境:VS2010 + Qt5.5.1

2.项目配置

1.设置附加包含目录

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

2.下图中的QTDIR是Qt5.5.1安装目录环境变量(默认路径:C:\Qt\Qt5.5.1\5.5\msvc2010)

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

 

2.设置附加库目录

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

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

 

3.设置附加依赖项

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

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

 

3.CLR中各种定义

1.接口定义

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

 

 

2.类定义

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

 

3.枚举定义

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

 

4.属性定义

1.接口中定义:

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

 2.类中定义:

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

 

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;