Как передать аргументы указателя из C# в функцию в C++ .dll
Привет,
Я сталкиваюсь с некоторыми проблемами при передаче аргументов из управляемого кода в неуправляемый код. У меня есть библиотека dll C++, и я хочу вызвать несколько ее функций из проекта C# (VS2010). Библиотека dll C++ не является собственной сборкой или COM-компонентом. Поэтому я использую DllImport - P\Invoke.
Детали функции C++
typedef unsigned long UINT32; typedef UNIT32 ABC_RESULT; // the return code from a ABC function typedef UINT32 ABC_HOBJECT; // basic object handle typedef ABC_HOBJECT ABC_HCONTEXT; // context object handle ABC_RESULT Abc_Context_Create( ABC_HCONTEXT* phContext // out );
phContext - получает дескриптор созданного объекта контекста.
Подпись C# -
public class Abc1api { [DllImport("Abc1.dll")] public static extern UInt32 Abc_Context_Create(UIntPtr phContext); }
И я называю это так, как показано ниже -
UInt32 result = 0; UIntPtr hContext = new UIntPtr(sizeof(UInt32)); result = Abc1api.Abc_Context_Create(hContext);
Я могу построить проект, но во время работы я получаю ниже ошибки -
Вызов функции PInvoke 'ABCTool!ABCTool.Abc1api::Abc_Context_Create' разбалансировал стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызове и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
Я попробовал IntPtr hContext вместо UIntPtr, но результат тот же.
Поэтому я изменил подпись C# , как указано ниже -
public class Abc1api { [DllImport("Abc1.dll")] [return: MarshalAs(UnmanagedType.U4)] public static extern UInt32 Abc_Context_Create([MarshalAs(UnmanagedType.U4), Out()] IntPtr phContext); }
И я называю это так, как показано ниже -
UInt32 result = 0; IntPtr hContext = new IntPtr(sizeof(UInt32)); result = Abc1api.Abc_Context_Create(hContext);
Когда я запускаю его, ошибка - не удается маршалировать "параметр #1": недопустимая комбинация управляемого/неуправляемого типа (Int/UInt должен быть сопряжен с SysInt или SysUInt).
Я попробовал UIntPtr, но тот же результат. Также попробовал выделить IntPtr hContext с помощью Маршала т. е.
IntPtr hkontext = Маршал.AllocHGlobal(Marshal.SizeOf(typeof(UInt32))); но получает ту же ошибку, что и выше.
Я так и не смог выяснить причину этой ошибки. Может ли кто-нибудь помочь мне в определении сигнатуры C# и как я могу передать аргументы, чтобы получить необходимый hContext из неуправляемого кода и использовать его?
Спасибо,
Сатиш.