C#bool数组,COM互操作和访问冲突

时间:2011-06-08 18:03:21

标签: .net boolean marshalling com-interop

我有一个用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];

1 个答案:

答案 0 :(得分:1)

VARIANT_BOOL确实是一个2字节的值:http://blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspx

因此,当你将其编组为UnmanagedType.VariantBool时,你并没有改变任何东西,因为你正在将它编组为完全相同的东西。

我首先尝试的是UnmanagedType.U1。如果这不起作用,我会尝试short[]而不是bool[]