我有一些没有源代码的DLL,这些DLL是用C ++(COM)编写的。我可以将它们导入到我的C#解决方案中,并可以使用给定的类和方法。这些方法的某些参数的类型为IntPtr,这是由typelib导入导致的。我确实知道我需要一个指针的结构的抽象类型。有时会对该结构进行管理,因此我不能简单地创建指向它的指针。
例如这样的方法:
void ListExtensions(out int pCount, System.IntPtr pExtensions)
pExtension必须是另一个COM DLL中称为“ ExtensionId”的结构数组的指针。结构看起来像这样:
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确实说“ Type 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.
任何人都可以提供一些建议,以正确地调用这样的方法吗?
预先感谢