2010-01-23 46 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

相關問題