Маршал 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?