gpt4 book ai didi

c# - 使用参数 "char**"为 C 函数生成 SWIG-Proxy

转载 作者:行者123 更新时间:2023-11-30 16:16:20 25 4
gpt4 key购买 nike

我尝试使用 SWIG 为该 C 代码生成一个包装器:

extern APIKeyRef_t parse_api_key(char* p0, char** p1)

第二个参数 p1 由 SWIG 生成为“SWIGTYPE_p_p_char”,这在 C# 中是无用的。如何告诉 SWIG 在此处生成“out string”或“ref string”参数?我读过 SWIG 的文档,但只理解了一半。对于 SWIG 专业人士来说,这可能是一件容易的事情。

该方法是从 Go 函数自动生成的。 “APIKeyRef_t”和“char*”工作完美 - SWIG 为它们生成了很好的包装器。

谢谢!

最佳答案

您可以在 SWIG 中执行此操作。我通常不会写太多(读:任何)C#,并且我在 Linux 上使用 Mono 对此进行了测试,因此我的答案有一个相当严重的警告 - 您应该仔细验证其正确性。

无论如何,我们可以生成一个包装器,我很高兴它是正确的。 SWIG(在大多数语言的大多数模式下)生成两部分的包装器。一些代码是用您为其构建包装器的语言(即此处的 C#)编写的,还有一些 C 或 C++。

通过自定义包装器中的 C# 入口点,我们可以为我们的论证奠定基础。本质上,我们使用它通过引用将 IntPtr (初始化为 NULL)传递到我们的 C 函数中。函数调用发生后,我们使用 Marshal.PtrToStringAnsi 将输出 String(我们现在知道其地址)读回 C# 世界,作为 C# 函数的输出。

最后剩下要做的就是清理。这一步取决于我们调用的函数的语义 - 如果我们最终拥有该字符串,我们需要在获取副本后释放它。因此,如果我们不拥有该字符串,我们就不能释放它。如果 FreeHGlobal 不是释放它的正确方法,您将需要替代方案。

%module test

%typemap(csin,pre="global::System.IntPtr tmp$csinput=global::System.IntPtr.Zero;",
post="$csinput=global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi(tmp$csinput);
global::System.Runtime.InteropServices.Marshal.FreeHGlobal(tmp$csinput);") char **OUTPUT "ref tmp$csinput";
%typemap(cstype) char **OUTPUT "out string";

%typemap(imtype) char **OUTPUT "ref global::System.IntPtr"

%apply char **OUTPUT { char **outarg };

%{
#include <shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
%}

%inline %{
void foobar(char **outarg) {
fprintf(stderr, "In foobar: outarg is: %p\n", outarg);
fprintf(stderr, "*outarg starts as: %p\n", *outarg); // This will be NULL, we initalised to Zero
*outarg = StrDupA("Hello world"); // This is good enough for testing
fprintf(stderr, "*outarg is now: %p\n", *outarg); // We can see this value by looking at our IntPtr instead of copying it
}
%}

有了这个,我们就可以成功运行这样的事情:

public class runme {
static void Main(string[] args) {
string blah;
test.foobar(out blah);
System.Console.WriteLine(blah);
}
}

效果符合预期。

关于c# - 使用参数 "char**"为 C 函数生成 SWIG-Proxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56630778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com