Marszałek va_list w delegacie C #

Próbuję wykonać tę pracę z c #:

Nagłówek C:

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

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

Implementacja 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>

To, co dzieje się tutaj, to wezwanie doNativeMethods.Init oddzwaniaLogMessage i przekazuje dane z kodu niezarządzanego jako parametry. Działa to w większości przypadków, w których argumenty są łańcuchami. Istnieje jednak połączenie, w którym format:

Załadowana wtyczka% s dla wersji% d.

a argumenty zawierają tylko łańcuch (nazwę wtyczki). Nie zawierają wartości wersji, co ma sens, odkąd użyłemstring[] w deklaracji delegata. Pytanie brzmi, jak powinienem napisać delegata, aby uzyskać ciąg i int?

Próbowałem użyćobject[] args i dostałem ten wyjątek:Wykryto nieprawidłowy VARIANT podczas konwersji z niezarządzanego VARIANT na obiekt zarządzany. Przekazanie nieprawidłowych VARIANTÓW do CLR może spowodować nieoczekiwane wyjątki, uszkodzenie lub utratę danych.

EDYCJA: Mogę zmienić podpis pełnomocnika na ten:

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

Mogę przeanalizować format i dowiedzieć się, ile argumentów należy oczekiwać i jakiego typu. Na przykład. dlaZaładowana wtyczka% s dla wersji% d. Spodziewałbym się ciągu i int. Czy jest jakiś sposób na uzyskanie tych 2 z IntPtr?

questionAnswers(4)

yourAnswerToTheQuestion