Система.Массив против байта [] при использовании CodeDom

#c# #arrays #codedom

#c# #массивы #codedom

Вопрос:

Я ссылаюсь на DLL-файл COM, используя CodeDom. Функция в файле dll имеет следующие параметры:

 Public Function Foo(fooString As String, fooByte() As Byte) 
End Function
  

Когда Visual Studio напрямую ссылается на этот DLL-файл (не используя CodeDom), я вызываю эту функцию следующим образом — и решение создается без проблем:

 Byte[] b = File.ReadAllBytes("Test.exe");
DllName.DllClass dll_obj_reference = new DllName.DllClass();

dll_obj_reference.Foo("data", b);
  

ПРИМЕЧАНИЕ:
Хотя я отправляю массив байтов в функцию (в соответствии с запросом VB6), Visual Studio фактически запрашивает тип System.Array . По какой-то причине решение по-прежнему работает нормально, и я могу вызвать функцию Foo без каких-либо проблем.

Однако мне не так повезло, когда я делаю все это через CodeDom. Я добавляю interop.DllName в качестве ссылки на сгенерированный проект и вызываю точно так же. Однако на этот раз CodeDom выдает ошибку, в которой говорится, что он не может преобразовать тип byte[] в тип ref System .Массив.

Итак, наконец, мой вопрос: как я могу преобразовать массив байтов, показанный выше, в тип System.Массив? Я не могу найти никаких статей в Интернете.

Спасибо за любую помощь!

Комментарии:

1. @BenVoigt обновлен с правильным форматированием.

Ответ №1:

Если требуется, чтобы массив передавался по ссылке, вы бы сделали:

 dll_obj_reference.Foo("data", ref b);
  

Комментарии:

1. Нет, я получаю сообщение об ошибке следующего содержания: ‘Argumenet 2: не удается преобразовать из ‘ref byte[]’ в ‘reef System. Массив ‘

2. Это должно означать «Система ссылок. Массив» конечно. Извините за любую путаницу.

3. @Evan: Тогда попробуйте Array a = b; dll_obj_reference.Foo("data", ref a); if (a != b) { /* figure out how to copy the elements from the new array created inside the DLL, given to you as a */ }

Ответ №2:

Вы можете преобразовать массив байтов в систему.Массив

 Byte[] b = File.ReadAllBytes("Test.exe");

Array barr = (Array)b;

DllName.DllClass dll_obj_reference = new DllName.DllClass();

dll_obj_reference.Foo("data", barr);