Maison > développement back-end > Golang > Explication détaillée de Golang compilé dans un fichier DLL

Explication détaillée de Golang compilé dans un fichier DLL

藏色散人
Libérer: 2020-12-31 15:07:16
avant
4440 Les gens l'ont consulté

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
}
Copier après la connexion

Compilez-le dans un fichier DLL :

go build -buildmode=c-shared -o exportgo.dll exportgo.go
Copier après la connexion

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));
        }
Copier après la connexion

Compilez le fichier CS pour obtenir l'exe

csc importgo.cs
Copier après la connexion

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 compris

Appels Go

>importgo.exe

Hello World!
From DLL: Bye!
55
Copier après la connexion
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;
    }
Copier après la connexion

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() {	
}                                                                                                                                        
Copier après la connexion
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)))
}
Copier après la connexion

Pour plus d'articles techniques connexes. , veuillez visiter la colonne tutoriel de langue go

 !

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal