Heim > Backend-Entwicklung > Golang > Detaillierte Erklärung von Golang, kompiliert in eine DLL-Datei

Detaillierte Erklärung von Golang, kompiliert in eine DLL-Datei

藏色散人
Freigeben: 2020-12-31 15:07:16
nach vorne
4443 Leute haben es durchsucht

Die folgende Golang-Tutorial-Kolumne stellt Ihnen die Methode zum Kompilieren von Golang in eine DLL-Datei vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Golang benötigt beim Kompilieren der DLL gcc, also installieren Sie zuerst MinGW.

Das 64-Bit-Windows-System sollte die 64-Bit-Version von MinGW herunterladen: https://sourceforge.net/projects/mingw-w64/

Führen Sie nach dem Herunterladen mingw-w64-install.exe aus, um die Installation von MingGW abzuschließen .

Schreiben Sie zuerst das Golang-Programm exportgo.go:

package main

import "C"
import "fmt"

//export PrintBye
func PrintBye() {
    fmt.Println("From DLL: Bye!")
}

//export Sum
func Sum(a int, b int) int {
    return a + b;
}

func main() {
    // Need a main function to make CGO compile package as C shared library
}
Nach dem Login kopieren

Kompilieren Sie es in eine DLL-Datei:

go build -buildmode=c-shared -o exportgo.dll exportgo.go
Nach dem Login kopieren

Nach der Kompilierung erhalten Sie zwei Dateien, exportgo.dll und exportgo.h.

Beziehen Sie sich auf die Funktionsdefinition in der Datei exportgo.h und schreiben Sie die C#-Datei importgo.cs:

using System;
using System.Runtime.InteropServices;

namespace HelloWorld
{
    class Hello 
    {
        [DllImport("exportgo.dll", EntryPoint="PrintBye")]
        static extern void PrintBye();

        [DllImport("exportgo.dll", EntryPoint="Sum")]
        static extern int Sum(int a, int b);

        static void Main() 
        {
            Console.WriteLine("Hello World!");
            PrintBye();

            Console.WriteLine(Sum(33, 22));
        }
Nach dem Login kopieren

Kompilieren Sie die CS-Datei, um exe zu erhalten

csc importgo.cs
Nach dem Login kopieren

Legen Sie exe und dll in dasselbe Verzeichnis und führen Sie sie aus.

>importgo.exe

Hello World!
From DLL: Bye!
55
Nach dem Login kopieren

Der String-Parameter in Golang kann in C# wie folgt referenziert werden:

public struct GoString
    {
        public string Value { get; set; }
        public int Length { get; set; }

        public static implicit operator GoString(string s)
        {
            return new GoString() { Value = s, Length = s.Length };
        }

        public static implicit operator string(GoString s) => s.Value;
    }
Nach dem Login kopieren
// func.go
package main

import "C"
import "fmt"

//export Add
func Add(a C.int, b C.int) C.int {
	return a + b
}

//export Print
func Print(s *C.char) {  
/* 
函数参数可以用 string, 但是用*C.char更通用一些。
由于string的数据结构,是可以被其它go程序调用的,
但其它语言(如 python)就不行了
*/
	print("Hello ", C.GoString(s)) //这里不能用fmt包,会报错,调了很久...
}
func main() {	
}                                                                                                                                        
Nach dem Login kopieren

Compile

go build -ldflags "-s -w" -buildmode=c-shared -o func.dll func.go
Es ist immer noch etwas groß, 880 KB, die reine C-Kompilierung ist nur 48 KB groß, es enthält wahrscheinlich nicht alle Abhängigkeiten, Go ist vollständig enthalten Weitere verwandte technische Artikel finden Sie in der Spalte „Go-Sprach-Tutorial“!

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Golang, kompiliert in eine DLL-Datei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage