用C++編寫C#可調用的DLL


  最近項目需要,要將一些關鍵算法放入DLL中。考慮到希望用VMProtect將代碼保護起來,於是使用C++編寫該DLL。

-- By Brisk Yu

  但是因為這個DLL最終是需要被C#調用的,因此在此記錄一下步驟。

 

1 創建工程

  打開VS2017,新建項目,如圖所示勾選:

   

  

  生成成功后,修改項目屬性:

   

 

2 用C++編寫DLL

  編寫相關的算法后,編寫一個包含入口點的CPP供C#程序調用:

extern "C" _declspec(dllexport) char* Func(char* str)

{

    //TODO

}

  之后編譯。注意似乎X64不能正常工作,需編譯X86版本。此外,如果release版本無法使用,嘗試使用debug版本。Release版本做過優化后,對於某些不健壯的C++語句可能會出現異常(如未初始化就引用之類的問題)。

 

3 C#調用C++編寫的DLL

        將1中編譯好的DLL放入工程的bin文件夾下。在程序中通過DLLImport引用。注意對於引用C++的DLL,需要添加特性CallingConvention = CallingConvention.Cdecl。

[DllImport("Prometheus.dll", CallingConvention = CallingConvention.Cdecl)]

public static extern IntPtr Func(byte[] str); 

        調用時注意C#中的變量和C++中的變量不一樣,需要增加轉換后才可使用:

string retlust = Marshal.PtrToStringAnsi(Func(Encoding.ASCII.GetBytes("admin")));

  對於C#和C++中變量的轉換需要及其注意,其中對於字符串作為輸入和輸出參數的情況需尤其注意。


免責聲明!

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



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