#c# #dynamic #interop
#c# #динамический #взаимодействие
Вопрос:
Хорошо, я вызываю библиотеку dll interop, к которой у меня нет доступа. Вот псевдокод:
dynamic myVariable = null;
firstInteropMethod(ref myVariable);
secondInteropMethod(myVariable); //Not by ref
Сигнатуры методов для двух методов являются
firstInteropMethod(ref object someObject);
secondInteropMethod(object someObject);
Ожидаемое значение представляет собой двойной массив определения
double[,]
Теперь самое интересное. Мой исходный код выдает неправильные результаты, но ошибки нет. Однако этот код:
firstInteropMethod(ref myVariable);
secondInteropMethod((double[,]) myVariable);
Дает ожидаемые результаты.
Используя watches и type of statements, я определил, что между двумя вызовами ничего не меняется, так что же получается? Почему должна быть разница и в чем она будет заключаться?
Комментарии:
1. Не могли бы вы показать нам определение оригинальных методов?
2. Что произойдет, если вы измените
dynamic
на простоobject
в объявлении переменной?3. У вас ведь нет
secondInteropMethod
перегрузки, не так ли?4. не могли бы вы также пояснить, почему конечное значение неверно? на него не влияет первый метод или второй метод? оба? я предполагаю, что это может быть проблема с боксом..
Ответ №1:
В этой статье MSDN о dynamic объясняется, почему приведение необходимо для COM-взаимодействия, когда операции объявляют тип параметра как object
и указывает, что использование /link:filelist
опции компилятора позволит вам также определить сигнатуры COM-метода как динамические.
Комментарии:
1. Мой вопрос не в том, отправляю ли я его по ссылке или нет, а в том, почему простое приведение имеет все значение в мире, когда по всей документации этого не должно быть. И, IIRC, поскольку я использую interop, мои параметры точно не передаются по ссылке, если в сигнатуре метода явно не указано иное из-за маршалинга yada, yada, yada.
2. @Synxmax Статья, которую я процитировал, была ответом на вопрос, почему необходимо приведение. Конкретная строка в статье (под заголовком COM Interop) гласит: «Многие COM-методы допускают изменение типов аргументов и возвращаемого типа путем обозначения типов как object . Это потребовало явного приведения значений для согласования со строго типизированными переменными в C #.»