Marshal va_list en C # delegado

Estoy tratando de hacer este trabajo desde c #:

Encabezado C:

<code>typedef void (LogFunc) (const char *format, va_list args);

bool Init(uint32 version, LogFunc *log)
</code>

Implementación de C #:

<code>static class NativeMethods
{
    [DllImport("My.dll", SetLastError = true)]
    internal static extern bool Init(uint version, LogFunc log);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl, SetLastError = true)]
    internal delegate void LogFunc(string format, string[] args);
}

class Program
{
    public static void Main(string[] args)
    {
         NativeMethods.Init(5, LogMessage);
         Console.ReadLine();
    }

    private static void LogMessage(string format, string[] args)
    {
         Console.WriteLine("Format: {0}, args: {1}", format, DisplayArgs(args));
    }
}
</code>

Lo que pasa aquí es que la llamada aNativeMethods.Init devuelve la llamadaLogMessage y pasa datos de código no administrado como parámetros. Esto funciona para la mayoría de los casos en los que los argumentos son cadenas. Sin embargo, hay una llamada en la que el formato es:

Plugin cargado% s para la versión% d.

y los argumentos contienen solo una cadena (el nombre del complemento). No contienen el valor de la versión, lo que tiene sentido desde que lo uséstring[] En la declaración del delegado. La pregunta es, ¿cómo debo escribir al delegado para obtener tanto la cadena como la int?

Traté de usarobject[] args y obtuve esta excepción:Se detectó un VARIANT no válido durante una conversión de un VARIANT no administrado a un objeto administrado. Pasar VARIANT no válidos al CLR puede causar excepciones inesperadas, daños o pérdida de datos.

EDITAR: podría cambiar la firma del delegado a esto:

<code>internal delegate void LogFunc(string format, IntPtr args);
</code>

Podría analizar el formato y averiguar cuántos argumentos esperar y de qué tipo. P.ej. paraPlugin cargado% s para la versión% d. Yo esperaría una cadena y un int. ¿Hay alguna manera de sacar estos 2 de ese IntPtr?

Respuestas a la pregunta(4)

Su respuesta a la pregunta