采用var args的函数的正确PInvoke签名是什么?

Fra*_*ger 7 .net pinvoke interop

有一个原生功能:

int sqlite3_config(int, ...);
Run Code Online (Sandbox Code Playgroud)

我想PInvoke这个功能.目前,我有这个声明:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);
Run Code Online (Sandbox Code Playgroud)

(结果和ConfigOption是表单的枚举enum Result : int { ... }.)

我实际上只对这个函数的单参数版本感兴趣,不需要其他args.它是否正确?

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

Sha*_*men 8

您需要使用__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());
    }       
}
Run Code Online (Sandbox Code Playgroud)

这不是对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);
Run Code Online (Sandbox Code Playgroud)