C#調用C++(QT5.5.1項目)的C++/CLI(CLR項目)項目技術筆記

導航

  1.編譯環境windows

  2.項目配置
數組

    1.設置附加包含目錄spa

    2.設置附加庫目錄.net

    3.設置附加依賴項3d

  3.CLR中各類定義對象

    1.接口定義blog

    2.類定義接口

    3.枚舉定義內存

    4.屬性定義string

  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)

 

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;
相關文章
相關標籤/搜索