我有一个用C ++编写的COM组件。其中一个MIDL接口具有如下定义的函数:
HRESULT __stdcall GetValues(
int length,
[ref, size_is(*length)] VARIANT_BOOL out[]);
GetValues
只需使用值填充out
数组:
for (int i = 0; i < length; ++i)
out[i] = (i % 2) != 0;
我试图使用以下内容从C#调用它:
private bool[] mValues = new bool[100];
...
myComObject.GetValues(100, ref this.mValues[0]);
我遇到了访问冲突错误。我认为C ++将bool
解释为2字节值,而在C#中它们只被分配为1字节值。
我看过Default Marshaling for Boolean Types,但我不确定如何将其应用于我的情况。 MarshalAs
属性似乎没有任何改变。我不知道如何使用它来通过引用传递数组?
[MarshalAs(UnmanagedType.U1)]
private bool[] mValues = new bool[100];
答案 0 :(得分:1)
VARIANT_BOOL
确实是一个2字节的值:http://blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspx
因此,当你将其编组为UnmanagedType.VariantBool
时,你并没有改变任何东西,因为你正在将它编组为完全相同的东西。
我首先尝试的是UnmanagedType.U1
。如果这不起作用,我会尝试short[]
而不是bool[]
。