關於C++/CLR的一些事


零,關於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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM