2010-01-23 66 views
7

有一种天然的功能:需要var args的函数的正确PInvoke签名是什么?

int sqlite3_config(int, ...); 

我想的PInvoke这个功能。目前,我有这样的声明:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")] 
public static extern Result Config (ConfigOption option); 

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

其实我只是在这个函数的单个参数版本感兴趣,不需要其他ARGS。它是否正确?

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

+0

我不知道标题**什么是适合可变参数函数的PInvoke签名?**会更友好。 – ChaosPandion 2010-01-23 20:08:12

+1

我一直在编程C我的整个职业生涯,我仍然不记得** variadic **这个词:-) – 2010-01-23 20:21:47

+1

那些计算机科学家和他们奇怪的名字!显然,arity意味着**函数可以采用的参数数量**。 – ChaosPandion 2010-01-23 20:26:12

回答

8

您需要使用__arglist关键字(这是无证),巴特#有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()); 
    }  
} 

的是pinvoking可变参数方法的标准方式,大多数解决方案将包裹它有几种方法,例如

[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); 
+0

我之前阅读过这方面的内容。为什么没有记录? – ChaosPandion 2010-01-23 20:05:46

+0

可能会错过ECMA提交的截止日期,现在MS将不会提交该关键字,直到它的sepc部分。 – 2010-01-23 20:09:49

+0

这很有道理。我也不禁想知道为什么他们使用'__arglist'而不是'arglist'。 – ChaosPandion 2010-01-23 20:12:52