У меня есть некоторые библиотеки DLL без исходного кода, написанные на C ++ (COM).Я могу импортировать их в свое решение C # и использовать данные классы и методы.Некоторые из параметров этих методов имеют тип IntPtr, который получается из импорта typelib.Я знаю точный тип структуры, на которую мне нужен указатель.Эта структура иногда управляется, поэтому я не могу просто создать указатель на нее.
Например, такой метод:
void ListExtensions(out int pCount, System.IntPtr pExtensions)
pExtension должен быть указателем на массив структурназывается "ExtensionId", который находится в другой COM DLL.Структура выглядит следующим образом:
public struct ExtensionId
{
public ExtensionGuid data;
}
public struct ExtensionGuid
{
public int Data1;
public short Data2;
public short Data3;
public byte[] Data4;
}
Как мне создать указатель на массив ExtensionId?Я пробовал что-то вроде этого
ExtensionId *ids = new ExtensionId[10];
, но Visual Studio говорит: «Тип ExtensionId [] не может быть приведен к ExtensionId *»
Я также пробовал это
ExtensionId[] ids = new ExtensionId[10];
GCHandle handle = GCHandle.Alloc(ids);
IntPtr ptr = (IntPtr)handle;
int pCount;
ListExtensions(out pCount, ptr);
ExtensionId[] result = (ExtensionId[])handle.Target;
но в последней строке кода программа вылетает со следующей ошибкой:
The runtime has encountered a fatal error. The address of the error was at 0x73d87e37, on thread 0x5f8. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
Может кто-нибудь дать совет, как правильно вызывать такой метод?
Заранее спасибо