欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-25 14:10:38
导航 1.编译环境 2.项目配置 1.设置附加包含目录 2.设置附加库目录 3.设置附加依赖项 3.CLR中各种定义 1.接口定义 2.类定义 3.枚举定义 4.属性定义 4.CLR中各种使用 1.类的实例化 2.命名空间的使用 5.CLR中数据类型的转换 1.String ^ 到 QString ......

导航

  

  

    

    

    

  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)

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;