.net 对于接受var args的函数,什么是正确的PInvoke签名?

.net 对于接受var args的函数,什么是正确的PInvoke签名?,.net,interop,pinvoke,.net,Interop,Pinvoke,有一个本机函数: int sqlite3_config(int, ...); 我想用PInvoke访问这个函数。目前,我有以下声明: [DllImport("sqlite3", EntryPoint = "sqlite3_config")] public static extern Result Config (ConfigOption option); (结果和配置选项是形式为enum Result:int{…}的枚举) 我实际上只对这个函数的单参数版本感兴趣,不需要其他参数。这是正确的吗

有一个本机函数:

int sqlite3_config(int, ...);
我想用PInvoke访问这个函数。目前,我有以下声明:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);
(结果和配置选项是形式为
enum Result:int{…}
的枚举)

我实际上只对这个函数的单参数版本感兴趣,不需要其他参数。这是正确的吗


我还想知道如何声明双参数形式(可能需要2个intptr?)

您需要使用u arglist关键字(未记录),Bart有一个

示例

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());
    }       
}
pinvoking-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);

我想知道标题是不是变分函数的正确PInvoke签名?我的整个职业生涯都在编写C语言,但我仍然记不起variadic这个词:-)那些计算机科学家和他们奇怪的名字!显然,arity意味着一个函数可以接受的参数数量。可能错过了提交ECMA的截止日期,现在MS将不会提交该关键字,直到它成为sepc的一部分。这是有道理的。我也忍不住想知道为什么他们使用
\uu arglist
而不是
arglist
。我在pinvoke.net上更新了wsprintf以使用u arglist。我发现错误时必须记住这样做。无论如何,我要回馈社区。谢谢,我通常不会这么做,但我觉得这不会有什么害处。