十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
最近需要用到golang編譯dll給C#調(diào)用,記錄一下,希望可以給遇到的朋友一些幫助。
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供朔州網(wǎng)站建設(shè)、朔州做網(wǎng)站、朔州網(wǎng)站設(shè)計(jì)、朔州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、朔州企業(yè)網(wǎng)站模板建站服務(wù),十載朔州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
開發(fā)環(huán)境:
1.windows7,VS2019,VScode
2.macOS,VScode
習(xí)慣在macos開發(fā)golang應(yīng)用,先寫好了dll,可以參考:
然后在windows7上面使用C#調(diào)用的時(shí)候出現(xiàn)不能識別dll,于是只好在windows7安裝golang開發(fā)環(huán)境。
簡單安裝了VScode和mingw64.
測試時(shí)發(fā)現(xiàn)了一個(gè)問題,如下:
最后找到的原因是我的windows7是64位的,mingw也是64位的,需要在VS2019里面將目標(biāo)平臺設(shè)置如下:
當(dāng)然,也可以將目標(biāo)平臺設(shè)置為x64的即可,我這樣設(shè)置,系統(tǒng)就自己去適配了。
網(wǎng)上的大部分是說設(shè)置目標(biāo)平臺為x86,這個(gè)要根據(jù)具體情況而來,不能一概而論。好了,希望能幫到您。
關(guān)鍵是 lpOnRecvCardEvent 這個(gè)函數(shù)的第二個(gè)參數(shù)是個(gè) C++ 指針。 樓主在 C# 中聲明這個(gè)導(dǎo)出函數(shù)時(shí),使用了并不對應(yīng)的 CardEvent[] C# 數(shù)組類型。 正確的做法是: 在 C# 聲明 lpOnRecvCardEvent 時(shí),第二個(gè)參數(shù)應(yīng)該是 IntPtr ,不是數(shù)組。 由于樓...
在golang中加載dll并調(diào)用函數(shù)流程如下:
1.加載dll動態(tài)庫到內(nèi)存 syscall.LoadLibrary
2.獲取函數(shù)地址 syscall.GetProcAddress
3.執(zhí)行系統(tǒng)調(diào)用,傳入?yún)?shù) syscall.Syscall6
一個(gè)系統(tǒng)消息框函數(shù)的調(diào)用示例:
GO語言的包估計(jì)是不能直接調(diào)用的,這個(gè)我沒試過。不過編譯成DLL的庫絕對是可以調(diào)用的,或者直接直接用系統(tǒng)命令調(diào)用編譯完成的可執(zhí)行程序。
1.最簡單的方法:
public static String reverse1(String str)
{ return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{ char[] array = s.toCharArray();
String reverse = ""; //注意這是空串,不是null
for (int i = array.length - 1; i = 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的變形:
public static String reverse2(String s)
{ int length = s.length();
String reverse = ""; //注意這是空串,不是null
for (int i = 0; i length; i++)
reverse = s.charAt(i) + reverse;//在字符串前面連接, 而非常見的后面
return reverse;
}
你在編譯器里面build一下,然后去\bin\debug目錄下找.exeexe就是可執(zhí)行文件了。運(yùn)行的時(shí)候可能需要用到debug目錄下的其他文件(如配置文件、dll等),所以需要把debug下的所有文件都放到一起。