2010-01-23 7 views
7

hay una función nativa:¿Cuál es la firma de PInvoke adecuada para una función que toma var args?

int sqlite3_config(int, ...); 

me gustaría PInvoke a esta función. Actualmente, tengo esta declaración:

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

(El resultado y el ConfigOption son enumeraciones de forma enum Result : int { ... }.)

estoy realmente interesado sólo en la versión de un solo parámetro de esta función y no necesito otro args. ¿Es esto correcto?

También tengo curiosidad por saber cómo declararía la forma de dos argumentos (quizás tomaría 2 IntPtrs?).

+0

Me pregunto si el título ** ¿Cuál es la firma de PInvoke adecuada para una función diferente? ** sería más amigable para Google. – ChaosPandion

+1

He estado programando C durante toda mi carrera y todavía no recuerdo la palabra ** variadic ** :-) –

+1

¡Esos informáticos y sus extraños nombres! Aparentemente, arity significa ** la cantidad de argumentos que una función puede tomar **. – ChaosPandion

Respuesta

8

Es necesario utilizar la palabra clave __arglist (que es indocumentado), Bart # tenía una nice blog about it.

Ejemplo

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

La hay una forma estándar de pinvoking métodos vararg, la mayoría de las soluciones se envuelva en varios métodos, por ejemplo

[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

He leído sobre esto antes. ¿Por qué no está documentado? – ChaosPandion

+0

probablemente se pierda la fecha límite para la presentación de ECMA y ahora MS no se comprometerá con esa palabra clave hasta que sea parte de la función sepc. –

+0

Eso tiene sentido. Tampoco puedo evitar preguntarme por qué usan '__arglist' en lugar de' arglist'. – ChaosPandion

Cuestiones relacionadas