Эта ошибка, скорее всего, означает, что у вас проблема с маршалингом.
Вы не показываете нам, что такое тип ErroneousWord
, но я предполагаю, что это какой-то класс, определенный в вашем коде C ++.Я предполагаю, что он неправильно маршалируется в .NET object
.
Учитывая, что это указатель (или указатель на указатель), попробуйте изменить этот параметр на тип IntPtr
для представления указателя.Это не должно иметь значения, поскольку в любом случае вы просто передаете NULL
для аргумента, легко представляемого с помощью статического IntPtr.Zero
поля .
Возможно, вы также захотите выполнить маршал Output
точно так же.Если вы измените параметр на тип IntPtr
, вы получите указатель на TCHAR*
, который затем вы можете передать другим неуправляемым функциям, как считаете нужным (например, для его освобождения).
Попробуйте следующий код:
[
DllImport("dllName",
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Cdecl)
]
public static extern UInt32 Foo(
string InputWord,
out IntPtr Output, // change to IntPtr
UInt32 Options,
out IntPtr List, // change to IntPtr
out UInt32 Count);
IntPtr output;
IntPtr dummyError = IntPtr.Zero;
uint dummyCount = 0;
uint x = 0;
Foo(Text, out output, x | y, out dummyError, out dummyCount);
Возможно, вам также понадобится метод Marshal.AllocHGlobal
, чтобы выделить неуправляемую память из вашего процесса, доступную для кода C ++.Убедитесь, что в этом случае вы также вызываете соответствующий метод Marshal.FreeHGlobal
для освобождения памяти.