Maison >développement back-end >Golang >Explication détaillée de Golang compilé dans un fichier DLL
La colonne suivante du tutoriel Golang vous présentera la méthode de compilation de Golang dans un fichier DLL. J'espère que cela sera utile aux amis dans le besoin !
Gcc est requis lors de la compilation dll dans Golang, alors installez d'abord MinGW.
Le système Windows 64 bits doit télécharger la version 64 bits de MinGW : https://sourceforge.net/projects/mingw-w64/
Après le téléchargement, exécutez mingw-w64-install .exe et terminez l’installation de MingGW.
Écrivez d'abord le programme golang 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 }
Compilez-le dans un fichier DLL :
go build -buildmode=c-shared -o exportgo.dll exportgo.go
Après la compilation, vous obtenez deux fichiers, exportgo.dll et exportgo. h.
Référez-vous à la définition de la fonction dans le fichier exportgo.h et écrivez le fichier C# 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)); }
Compilez le fichier CS pour obtenir l'exe
csc importgo.cs
Mettez l'exe et la dll Dans le même répertoire, exécutez. " -s -w" -buildmode=c-shared -o func.dll func.go
est encore un peu gros, 880 Ko La version C pure ne fait que 48 Ko. Elle ne devrait pas tout contenir. les dépendances. , go est tout comprisAppels Go
>importgo.exe Hello World! From DLL: Bye! 55
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; }Appels Python
// 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() { }Appels C++
package main import ( "fmt" "syscall" ) func main() { dll := syscall.NewLazyDLL("func.dll") add := dll.NewProc("Add") prt := dll.NewProc("Print") r, err, msg := add.Call(32, 44) fmt.Println(r) fmt.Println(err) fmt.Println(msg) name := C.CString("Andy") prt.Call(uintptr(unsafe.Pointer(name))) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!