Как вызвать COM-метод с помощью указателей IntPtr - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть некоторые библиотеки 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.

Может кто-нибудь дать совет, как правильно вызывать такой метод?

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...