Использование параметров ref Array в C # с COM-взаимодействием - PullRequest
5 голосов
/ 16 апреля 2010

У меня есть сторонняя библиотека COM, которую я использую, и у меня проблемы с параметрами массива.

Подпись метода, которую я вызываю, выглядит следующим образом:

int GetItems(ref System.Array theArray)

В документации сказано, что возвращаемое значение метода - это число элементов, которые он будет заполнять в массиве, но когда он вызывается, все значения в массиве являются просто значениями по умолчанию (они являются структурами), даже если метод возвращает ненулевое возвращаемое значение.

Я знаю, что здесь происходит что-то интересное с COM-взаимодействием, но я действительно не очень разбираюсь в этом и не могу этого понять. Вот как я пытался получить к нему доступ:

Array items = Array.CreateInstance(typeof(structItem), 100);
int numberOfItems = instance.GetItems(items);

Array items = Array.CreateInstance(typeof(structItem), 100);
int numberOfItems = instance.GetItems(ref items);

structItem[] items = new structItem[100];
int numberOfItems = instance.GetItems(items);

structItem[] items = new structItem[100];
int numberOfItems = instance.GetItems(ref items);

Что я делаю не так?

ОБНОВЛЕНИЕ: Я думаю, что это может иметь какое-то отношение к SafeArrays, как описано здесь: http://www.west -wind.com / Weblog / posts / 464427.aspx Разница в том, что я должен передать массив по ссылке, а не просто обработать возвращаемое значение. Конкретное решение из этой статьи не работает, но я чувствую, что мне становится теплее.

1 Ответ

0 голосов
/ 16 апреля 2010

Прошло много времени с тех пор, как я сделал Interop, поэтому я не уверен, но я думаю, что вы должны выделить неуправляемую память для отправки в библиотеку COM.Я бы посмотрел на класс Marshal, особенно Marshal.AllocHGlobal (вам, вероятно, придется использовать FreeHGlobal, чтобы освободить память назад).

Что-то вроде этого может быть:

IntPtr p = Marshal.AlloHGlobal(items.Length * Marshal.SizeOf(typeof(structItem));  
Marshal.Copy(items, 0, p, items.Length);  
...