株洲 網(wǎng)站建設(shè)百度關(guān)鍵詞優(yōu)化詞精靈
參考:C#總結(jié)(四)調(diào)用C++動(dòng)態(tài)庫(kù)(https://www.shuzhiduo.com/A/A2dmV49qze/)
文章目錄
- C#加載C動(dòng)態(tài)庫(kù)
- C#加載C#動(dòng)態(tài)庫(kù)
涉及到的概念知識(shí):
托管DLL和非托管DLL的區(qū)別(https://www.tinymind.net.cn/articles/87898287368798)
C#加載C動(dòng)態(tài)庫(kù)
[DllImport("xxx.dll", CallingConvention = CallingConvention.Cdecl)]public static extern String HanShuMing();
-
DllImport的第一個(gè)參數(shù)SDK是動(dòng)態(tài)庫(kù)dll的路徑,建議在程序根目錄創(chuàng)建一個(gè)子目錄來放置相應(yīng)的C/C++動(dòng)態(tài)庫(kù)文件,方便以后更新。
-
CallingConvention 參數(shù)是c#調(diào)用C/C++的方式 是個(gè)枚舉官方解釋如下:
Winapi:此成員實(shí)際上不是調(diào)用約定,而是使用默認(rèn)值平臺(tái)調(diào)用約定。例如,在Windows上,默認(rèn)值為System.Runtime.InteropServices.CallingConvention.StdCall在Windows CE.NET上,它是System.Runtime.InteropServices.CallingConvention.Decl。
Cdecl:調(diào)用者清理堆棧。這允許使用varargs調(diào)用函數(shù),使得適合用于接受可變數(shù)量的參數(shù)的方法,例如Printf。
StdCall:被調(diào)用者清理堆棧。這是調(diào)用非托管的默認(rèn)約定,具有平臺(tái)調(diào)用的函數(shù)。
ThisCall:第一個(gè)參數(shù)是this指針,并存儲(chǔ)在寄存器ECX中。另外參數(shù)被推送到堆棧上。此調(diào)用約定用于調(diào)用方法從非托管DLL導(dǎo)出的類。
FastCall:不支持此調(diào)用約定。C#加載C#動(dòng)態(tài)庫(kù)
點(diǎn)擊project->Add Reference…
Browse->Recent->Browse…選擇一個(gè)你要加載的動(dòng)態(tài)庫(kù)即可。
上一步有可能出現(xiàn)動(dòng)態(tài)庫(kù)加載不進(jìn)去的情況,目前我知道的可能的原因有兩個(gè),一個(gè)是沒有權(quán)限,一個(gè)是該項(xiàng)目已經(jīng)添加過相同名字的動(dòng)態(tài)庫(kù),后者需要將之前添加的動(dòng)態(tài)庫(kù)刪除再添加,如下圖所示:
點(diǎn)開References下找到對(duì)應(yīng)動(dòng)態(tài)庫(kù),刪除
然后在此選擇改動(dòng)態(tài)庫(kù)添加,點(diǎn)擊OK即可