最近專案需要,要將一些關鍵演算法放入dll中。考慮到希望用vmprotect將**保護起來,於是使用c++編寫該dll。
-- by brisk yu
但是因為這個dll最終是需要被c#呼叫的,因此在此記錄一下步驟。
1 建立工程
開啟vs2017,新建專案,如圖所示勾選:
生成成功後,修改專案屬性:
2 用c++編寫dll
extern"c之後編譯。注意似乎x64不能正常工作,需編譯x86版本。此外,如果release版本無法使用,嘗試使用debug版本。release版本做過優化後,對於某些不健壯的c++語句可能會出現異常(如未初始化就引用之類的問題)。" _declspec(dllexport) char* func(char*str)
3 c#呼叫c++編寫的dll
將1中編譯好的dll放入工程的bin資料夾下。在程式中通過dllimport引用。注意對於引用c++的dll,需要新增特性callingconvention = callingconvention.cdecl。
[dllimport("呼叫時注意c#中的變數和c++中的變數不一樣,需要增加轉換後才可使用:prometheus.dll
", callingconvention =callingconvention.cdecl)]
public
static
extern intptr func(byte str);
string retlust = marshal.ptrtostringansi(func(encoding.ascii.getbytes("對於c#和c++中變數的轉換需要及其注意,其中對於字串作為輸入和輸出引數的情況需尤其注意。admin
")));
C 呼叫C 編寫的dll
介面還是c 寫的方便點,主要是有乙個視覺化的編輯器,不想畫太多的時間在介面上。但是自己又對c 了解的多一些,所以在需要乙個良好的介面的情況下,使用c 來寫 邏輯,將其編譯成乙個dll,然後用c 寫介面,extern c declspec dllexport int testadd int a,int...
C 呼叫C 程式編寫的dll
c 呼叫c 程式編寫的dll 比起 c 呼叫c 程式編寫的dll要方便得多。假定我已經有個cplusplusdll.dll,此dll是用c 寫的,下面的程式是c 呼叫的程式。注意dll要放到c 工程的bin目錄下的debug目錄下。using system using system.collecti...
C 中呼叫C 編寫的Dll
在vs2013中建立乙個win32控制台專案,單擊下一步,然後選擇dll。生成的工程目錄結構為 在自動生成的檔案中,dllmain.cpp 作為定義dll應用程式的入口點,它的作用跟exe檔案有個main或者winmain入口函式是一樣的。可以在目標cpp檔案 dllcxj.cpp 中編寫自己要實現...