Heim >Backend-Entwicklung >Golang >Detaillierte Erklärung von Golang, kompiliert in eine DLL-Datei
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 }
Kompilieren Sie es in eine DLL-Datei:
go build -buildmode=c-shared -o exportgo.dll exportgo.go
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)); }
Kompilieren Sie die CS-Datei, um exe zu erhalten
csc importgo.cs
Legen Sie exe und dll in dasselbe Verzeichnis und führen Sie sie aus.
>importgo.exe Hello World! From DLL: Bye! 55
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; }
// 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() { }
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!