我试图从 c# 调用 golang dll,并将结果和性能与从 c# 调用 c dll 进行比较,所以我做了以下操作:
我开始构建 c dll 并将其称为第 1 步:编写 C 代码
// cmdll.c
// Compile with: -LD
int __declspec(dllexport) SampleMethod(int i)
{
return i*10;
}
第 2 步:编译 C 代码:
打开Visual Studio x64 Native Tools Command Prompt
运行命令:cl -LD cmdll.c
第 3 步:编写 C# 代码
// cm.cs
using 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.go
package main
import "C"
//export SamplMethod
func 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.cs
using 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));
}
}
慕妹3146593
相关分类