【发布时间】:2021-02-02 14:34:52
【问题描述】:
我正在尝试从本地库调用 .NET 中的函数,如下所示:
typedef int (WINAPI* TGetAllObjects)(int hModel, VARIANT& objects);
如果在 C++ 客户端调用它,调试器会显示对象是 VARIANT 的安全数组,每个 VARIANT 都是 BSTR 的安全数组。
我尝试在 C# 中实现如下:
public delegate TRetCode TGetAllObjects(int hModel,
[Out,In,MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT )] ref MyStruct[] objects);
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
public string[] Objects;
}
调用方法时报错:
System.Runtime.InteropServices.SafeArrayTypeMismatchException:“指定的数组不是预期的类型。”
请告诉我在这种情况下如何正确组织数据编组。
【问题讨论】:
-
听起来你有一个字符串数组?也许你需要
[Out,In,MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT )] object[][] objects不要认为你应该使用ref -
@Charlieface 我试过了。抛出异常 System.Runtime.InteropServices.MarshalDirectiveException: "Cannot marshal 'parameter #2': There is no marshaling support for nested arrays."
-
好的,
object[]呢? -
@Charlieface 没有发生错误。但是传递的数组仍然是空的。
标签: c# c++ native marshalling