Динамическое ключевое слово, C # и взаимодействие?

#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 #.»