C # bool массивы, COM-взаимодействие и нарушения доступа - PullRequest
2 голосов
/ 08 июня 2011

У меня есть COM-компонент, написанный на C ++. Один из интерфейсов 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 s как 2-байтовые значения, тогда как в C # они выделяются только как 1-байтовые значения.

Я смотрел на Маршалинг по умолчанию для логических типов , но я не уверен, как применить это к моей ситуации. Атрибут MarshalAs, похоже, ничего не меняет. Я не уверен, как использовать его для передачи массива по ссылке?

[MarshalAs(UnmanagedType.U1)]
private bool[] mValues = new bool[100];

1 Ответ

1 голос
/ 08 июня 2011

VARIANT_BOOL действительно является 2-байтовым значением: http://blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspx

Поэтому, когда вы упорядочиваете его как UnmanagedType.VariantBool, вы ничего не меняете, потому что вы упорядочиваете его как точно такое жевещь, которую все равно возвращают.

Сначала я попробую UnmanagedType.U1.Если это не сработает, я бы попробовал short[] вместо bool[].

...