У меня есть 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];