Маршал va_list в C # делегат

Я пытаюсь сделать эту работу из C #:

C заголовок:

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

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

Реализация 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>

Что здесь происходит, так это то, чтоNativeMethods.Init перезваниваетLogMessage и передает данные из неуправляемого кода в качестве параметров. Это работает для большинства случаев, когда аргументы являются строками. Тем не менее, есть вызов, по которому формат:

Loaded plugin %s for version %d.

а args содержит только строку (имя плагина). Они не содержат значения версии, что имеет смысл, так как я использовалstring[] в декларации делегата. Вопрос в том, как мне написать делегат, чтобы получить как строку, так и int?

Я пытался с помощьюobject[] args и получил это исключение: An invalid VARIANT was detected during a conversion from an unmanaged VARIANT to a managed object. Passing invalid VARIANTs to the CLR can cause unexpected exceptions, corruption or data loss.

РЕДАКТИРОВАТЬ: Я мог бы изменить подпись делегата на это:

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

Я мог бы разобрать формат и выяснить, сколько аргументов ожидать и какого типа. Например. заLoaded plugin %s for version %d. Я ожидал бы строку и Int. Есть ли способ получить эти 2 из этого IntPtr?

Ответы на вопрос(4)

Ваш ответ на вопрос