为了账号安全,请及时绑定邮箱和手机立即绑定

未处理的异常:System.EntryPointNotFoundException:无法在

未处理的异常:System.EntryPointNotFoundException:无法在

Go
一只斗牛犬 2023-03-07 14:08:12
我试图从 c# 调用 golang dll,并将结果和性能与从 c# 调用 c dll 进行比较,所以我做了以下操作:我开始构建 c dll 并将其称为第 1 步:编写 C 代码// cmdll.c// Compile with: -LDint __declspec(dllexport) SampleMethod(int i){  return i*10;}第 2 步:编译 C 代码:打开Visual Studio x64 Native Tools Command Prompt运行命令:cl -LD cmdll.c第 3 步:编写 C# 代码// cm.csusing System;using System.Runtime.InteropServices;public class MainClass{    [DllImport("Cmdll.dll")]    public static extern int SampleMethod(int x); // function signature, must have a return type    static void Main()    {        Console.WriteLine("SampleMethod() returns {0}.", SamplMethod(5));    }}第 4 步:编译 c# 文件并将 exe 构建为:打开Visual Studio x64 Native Tools Command Prompt运行命令:csc -platform:x64 cm.cs上面的事情运行顺利我想使用 golang 做同样的事情,并遵循以下内容:第一步:编写go代码://lib.gopackage mainimport "C"//export SamplMethodfunc SamplMethod(i int) int {    return i * 10}func main() {    // Need a main function to make CGO compile package as C shared library}第二步:构建dll文件,将上面的代码编译为:go build -ldflags="-s -w" -o lib.dll -buildmode=c-shared lib.go我使用 来-ldflags="-s -w"减小生成的文件大小,但不确定-buildmode我应该使用什么,所以随机选择c-shared而不是c-archive 更新:我也尝试过go build -ldflags="-s -w" -o lib.dll -buildmode=c-archive lib.go并得到相同的结果第 3 步:编写 ac 代码,将.dll和.h生成的文件结合起来go生成等效文件c dll//goDll.c#include <stdio.h>#include "lib.h"// force gcc to link in go runtime (may be a better solution than this)GoInt SamplMethod(GoInt i);void main() {}第 4 步:将 goDll.c 文件编译为:gcc -shared -pthread -o goDll.dll goDll.c lib.dll -lWinMM -lntdll -lWS2_32第 5 步:构建 c# 代码以调用生成的 dll,代码与上面相同,但更改 dll 文件名:// cm.csusing System;using System.Runtime.InteropServices;public class MainClass{    [DllImport("goDll.dll")]    public static extern int SampleMethod(int x); // function signature, must have a return type    static void Main()    {        Console.WriteLine("SampleMethod() returns {0}.", SamplMethod(5));    }}
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

它与我一起工作如下:


第一步:编写go代码:


// main.go

package main


import "C"

import "fmt"


//export HelloWorld

func HelloWorld() {

    fmt.Printf("hello world from GO\n")

}


func main() {}


// compile the code as:

// go build -ldflags="-s -w" -buildmode=c-shared -o libgo.dll main.go

第 2 步:将 C# 代码编写为:


// main.cs

using System;

using System.Runtime.InteropServices;

public class MainClass

{

    [DllImport("libgo.dll")]

    public static extern void HelloWorld(); // function signature, must have a return type


    static void Main()

    {

        HelloWorld();

    }

}


// compile as:

// open:

// Visual Studio x64 Native Tools Command Prompt

// csc -platform:x64 cm.cs

第三步:编译这两个文件,从编译go文件开始


第四步:运行可执行文件:

//img1.sycdn.imooc.com//6406d4e30001e73617560935.jpg

更新


去文件:

// main.go

package main


import (

    "fmt"

)


// The import "C" should come directly after the // #include ..., i.e. no empty lines allowed,

// if there are empty lines, the compliler will read the // #include as normal comment, not as C import


/*

#include <stdlib.h>

*/

import "C"


//export GetHello

func GetHello(Input *C.char) *C.char {

    cStr := C.CString(fmt.Sprintf("From DLL: Hello, %s!\n", C.GoString(Input)))

    //  C.free(unsafe.Pointer(cStr))

    return cStr

}


func main() {}


// compile the code as:

// go build -ldflags="-s -w" -buildmode=c-shared -o libgo.dll main.go

C#文件:

// main.cs

using System;

using System.Text;

using System.Runtime.InteropServices;

public class MainClass

{

    [DllImport("libgo.dll", CharSet = CharSet.Unicode, 

    CallingConvention = CallingConvention.StdCall)]

    public static extern IntPtr GetHello(byte[] data);


    static string CallDll(string name) {

        IntPtr output= IntPtr.Zero;

        var a = GetHello(Encoding.UTF8.GetBytes(name));


        return "GetHello Returns: " + Marshal.PtrToStringAnsi(a);

    }


    static void Main()

    {

        Console.WriteLine(CallDll("Ahmad"));

    }

}


// compile as:

// open:

// Visual Studio x64 Native Tools Command Prompt

// csc -platform:x64 main.cs

这是一个使用字符串的示例:

//img1.sycdn.imooc.com//6406d4f600013a5e19200763.jpg

查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 927 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信