gpt4 book ai didi

.net - 对于采用var args的函数,正确的PInvoke签名是什么?

转载 作者:行者123 更新时间:2023-12-04 11:45:29 26 4
gpt4 key购买 nike

有一个 native 函数:

int sqlite3_config(int, ...);

我想PInvoke这个功能。目前,我有以下声明:
[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);

(结果和ConfigOption是形式为 enum Result : int { ... }的枚举。)

我实际上只对该函数的单参数版本感兴趣,不需要其他参数。这样对吗?

我也很好奇您将如何声明两个参数形式(也许需要2个IntPtrs?)。

最佳答案

您需要使用__arglist关键字(未记录),Bart#有一个nice blog about it.

示例

class Program
{
[DllImport("user32.dll")]
static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist);

static void Main(String[] args)
{
var sb = new StringBuilder();
wsprintf(sb, "%s %s %s", __arglist("1", "2", "3"));
Console.Write(sb.ToString());
}
}

调用vararg方法不是标准方法,大多数解决方案会将其包装为几种方法,例如
[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods1(String fmt,
String arg1);

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods2(String fmt,
String arg1, String arg2);

关于.net - 对于采用var args的函数,正确的PInvoke签名是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2124490/

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