零,關於C++/CLR:
如果需要用到C++調用C#的東西的話,可以使用C++/CLR。這個算是對C++的擴展,不屬於標准C++的東西。
一,一些基礎的使用:
以VS2012為例,在project->properties->General->Common Language Runtime Support中,選擇"Common Language Runtime Support (/clr)",就可以在工程中使用C++/CLR的東西了。
比如寫個C#的類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpDllTest { public class CSharpClassMiao { public CSharpClassMiao() { } ~ CSharpClassMiao() { } void printMiao() { Console.Write("Hallo Kaetzchen! \r\n"); } } }
然后把編譯好的DLL扔到C++的工程里,C++部分的代碼如下:
#include < vcclr.h > #include <iostream> #using <../debug/CSharpDllTest.dll> using namespace std; using namespace CSharpDllTest; int _tmain(int argc, _TCHAR* argv[]) { CSharpClassMiao^ miao = gcnew CSharpClassMiao(); miao->printMiao(); }
這樣就可以了。
但是gcnew出來的東西是屬於托管的內容,什么時候留着什么時候刪掉全看GC的心情。如果不放心怕被回收掉的話可以使用gcroot<T>,然后把它放到類的成員變量里。
這個原理相當於保存一個該對象的引用,只有引用計數大於0,GC就不會回收它了。
個人喜歡把C#類用C++封裝一層。
例如:
class CppClassMiao { public: CppClassMiao() { m_instance = gcnew CSharpClassMiao(); } ~CppClassMiao() { //銷毀的時候m_instance也就消失了,剩下的交給GC就好。 } private: gcroot<CSharpClassMiao^> m_instance; };
二,關於類型轉換:
需要用到C#的Marshal類。
C++轉C#:
參考:https://msdn.microsoft.com/zh-cn/library/ms146632%28v=vs.110%29.aspx
C#轉C++:
參考:https://msdn.microsoft.com/zh-cn/library/ms146626%28v=vs.110%29.aspx
int testLen = 1024 * 1024 * 100; //這個是給C#用的字符數組了 array<unsigned char>^ ay = gcnew array<unsigned char>(testLen); //C++用的 char* ch = new char[testLen]; // ... // ... System::IntPtr^ ptr = gcnew System::IntPtr(ch); //把C++數組的東西賦值到C#里 System::Runtime::InteropServices::Marshal::Copy(*ptr, ay, 0, testLen); //把C#數組里的東西賦值給C++數組 System::Runtime::InteropServices::Marshal::Copy(ay, 0, *ptr, testLen);