【发布时间】:2023-02-24 04:12:19
【问题描述】:
我正在使用 CGO 从 GO 代码编译一个 C 库。然后从 C# 调用库函数。
在这个 GO 代码中,我有一个函数需要一个[]细绳输入,例如:
func StringArray(strings []string)
我还有另一个函数需要一个[]整数输入,例如:
func IntArray(vals []int)
如果我查看生成的头文件,我可以看到上述函数的以下内容:
extern __declspec(dllexport) void IntArray(GoSlice vals);
extern __declspec(dllexport) void StringArray(GoSlice strings);
通过创建以下结构,我可以从 C# 成功调用 IntArray 函数:
internal struct GoSlice
{
public IntPtr data;
public long len, cap;
public GoSlice(IntPtr data, long len, long cap)
{
this.data = data;
this.len = len;
this.cap = cap;
}
}
然后像这样调用函数:
long[] data = { 1, 2, 3, 4, 5, 6 };
IntPtr data_ptr = Marshal.AllocHGlobal(Buffer.ByteLength(data));
Marshal.Copy(data, 0, data_ptr, data.Length);
var nums = new GoSlice(data_ptr, data.Length, data.Length);
IntArray(nums);
Marshal.Copy(nums.data, data, 0, data.Length);
我也可以成功调用期望的函数细绳输入,通过创建以下结构:
internal struct GoString
{
public string msg;
public long len;
public GoString(string msg, long len)
{
this.msg = msg;
this.len = len;
}
}
然后像这样调用函数:
string inputString = "Test";
GoString goString = new GoString(inputString, inputString.Length);
StringInput(goString);
我努力实现的是将预期的 []string GoSlice 传递给 StringArray 函数。有什么建议么?我需要 GoSlice 包含字符串而不是整数。
我已经尝试以各种方式将字符串而不是整数传递给 GoSlice,后者不适用于混合结果。我希望最终得到一个 []string GoSlice,它可以在从 C# 调用“CGO compiled”GO 函数时使用。
【问题讨论】: