go語(yǔ)言開(kāi)發(fā)動(dòng)態(tài)庫(kù)

go build 可以指定buildmode。分為了多種模式。具體模式如下。

模式 說(shuō)明(當(dāng)前go版本 1.10.3)
archive 編譯成二進(jìn)制文件。一般是靜態(tài)庫(kù)文件。 xx.a
c-archive 編譯成C歸檔文件。C可調(diào)用的靜態(tài)庫(kù)。xx.a。注意要編譯成此類(lèi)文件需要import C 并且要外部調(diào)用的函數(shù)要使用 “//export 函數(shù)名” 的方式在函數(shù)上方注釋(//和export直接不能有空格!??!)。否則函數(shù)默認(rèn)不會(huì)被導(dǎo)出。
c-shared 編譯成C共享庫(kù)。同樣需要 import “C” 和在函數(shù)上方注釋 // export xxx
default 對(duì)于有main包的直接編譯成可執(zhí)行文件。沒(méi)有main包的,編譯成.a文件
exe 編譯成window可執(zhí)行程序
plugin 將main包和依賴(lài)的包一起編譯成go plugin。非main包忽略。【類(lèi)似C的共享庫(kù)或靜態(tài)庫(kù)。插件式開(kāi)發(fā)使用】

編譯生成 DLL 文件

MinGW 安裝后有一個(gè)叫做 Run terminal 的快捷方式,運(yùn)行后進(jìn)入命令行方式,進(jìn)入 exportgo.go 所在目錄,運(yùn)行如下命令:

go build -buildmode=c-shared -o exportgo.dll exportgo.go ———————————————— 版權(quán)聲明:本文為CSDN博主「quicmous」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/quicmous/article/details/102772419

MinGW已經(jīng)不推薦使用。只有32位版,更新速度也不怎么樣。

MinGW-w64更新最快,基本上gcc更近后幾周內(nèi)就會(huì)跟進(jìn)。32位和64位都提供。

TDM-GCC,更新速度也不怎么樣,同時(shí)提供32位和64位。

涉及64位時(shí),TDM-GCC和MinGW-w64還有一個(gè)重要的區(qū)別,64位的TDM-GCC既能編譯64位binary,也能編譯32位binary(用-m32參數(shù))。而MinGW-w64無(wú)此能力,你需要裝32位和64位的兩套MinGW w64 tool chain來(lái)編譯兩種binary。

MinGW: 編譯目標(biāo)僅兼容 32 位應(yīng)用程序,最新的官方二進(jìn)制版本為 GCC 9.2.0。

MinGW-w64: 衍生自 MinGW 的項(xiàng)目,編譯目標(biāo)兼容 32 位應(yīng)用程序與和64 位應(yīng)用程序,最新的官方二進(jìn)制版本為 GCC 8.1.0。(MingW-W64-builds)

TDM-GCC: 衍生自 MinGW 和 MinGW-w64 的項(xiàng)目,分為 32 位與 64 位兩個(gè)版本,32 位版本的編譯目標(biāo)僅兼容 32 位應(yīng)用程序,64位版本的編譯目標(biāo)兼容 32 位應(yīng)用程序和 64 位應(yīng)用程序,最新的官方二進(jìn)制版本為 GCC 9.2.0。

注意事項(xiàng)

  • go語(yǔ)言函數(shù)中的string,不能直接對(duì)應(yīng)c#中的string
  • c# 定義
    public struct GoString {
        public IntPtr str;
        public Int64 length;
       
        public GoString(string s)
        {
            IntPtr intPtr_S = Marshal.StringToHGlobalAnsi(s);
            str = intPtr_S;
            length = s.Length;
        }
    };

    class Inwhtl_DLL
    {
        //[DllImport("C:\\Users\\John\\go\\src\\e.coding.net\\111\\inwarehousetool\\checktool\\checktool.dll", CharSet = CharSet.Auto, EntryPoint = "Check")]

        [DllImport("checktool.dll", CharSet = CharSet.Auto, EntryPoint = "Check")]
        public static extern int Check(GoString hfile, GoString file, GoString rptfile);
    }


       string hfile = "D:/chktool/conf/host-product.json";
            string file = "D:/chktool/conf/checkstd-1111-v10.json";
            string rptfile = "D:/chktool/report/checkreport.json11";

            // ------------------ 執(zhí)行檢測(cè)
            //ExecCheckExe();
            int ret = Inwhtl_DLL.Check(new GoString(hfile), new GoString(file), new GoString(rptfile));
            if (ret > 200) {
                MessageBox.Show(string.Format("檢測(cè)失敗,錯(cuò)誤碼:{0}", ret));
                return null;
            }

注意事項(xiàng)

不建議使用GoString,正確的用法,請(qǐng)參考https://www.cnblogs.com/jiftle/p/12817334.html

參考文章

原文鏈接:https://blog.csdn.net/github_33719169/article/details/84826983

[golang學(xué)習(xí)筆記-生成windows平臺(tái)的dll文件]https://blog.csdn.net/qq_30549833/article/details/86157744

Golang 編譯生成 DLL 文件
C# 結(jié)合 Golang 開(kāi)發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容