最近項目需要,要將一些關鍵算法放入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++中變量的轉換需要及其注意,其中對於字符串作為輸入和輸出參數的情況需尤其注意。