Какова правильная сигнатура PInvoke для функции, которая принимает var args? - PullRequest
7 голосов
/ 23 января 2010

Есть встроенная функция:

int sqlite3_config(int, ...);

Я хотел бы вызвать эту функцию. В настоящее время у меня есть это объявление:

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

(Result и ConfigOption являются перечислениями вида enum Result : int { ... }.)

Меня интересует только версия этой функции с одним параметром, и мне не нужны другие аргументы. Это правильно?

Мне также любопытно, как бы вы объявили форму с двумя аргументами (возможно, это заняло бы 2 IntPtrs?).

1 Ответ

8 голосов
/ 23 января 2010

Вам нужно использовать ключевое слово __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());
    }       
}

Не является стандартным способом определения 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);
...