#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);