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?