Используйте объект класса в разных версиях одной и той же сборки, используя Reflection - PullRequest
5 голосов
/ 14 января 2012

У меня есть требование загрузки сборки другой версии (у меня уже есть сборка с тем же именем в моем приложении).

Я смог загрузить сборку и загрузить метод, который мне нужно вызвать, используя отражениено когда я вызываю метод, передавая мой объект класса в качестве аргумента, я получаю исключение, что объект класса не может быть преобразован в тип параметра аргумента.

Пример кода -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version");
object classObject = myAssembly.CreateInstance("ClassName");
Type classType = myAssembly.GetType("ClassName");
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance);

// Creating an object of class in the latest assembly and need to pass this
// to method in assembly with different version.
ClassInBothVesions parameter = new ClassInBothVesions();

myMethod.Invoke(classObject, new object[] { parameter });

Здесь параметр - это объект класса, который у меня есть в сборке, но поскольку класс параметров создается в сборке текущей версии.И когда я пытаюсь передать его методу предыдущей сборки, я получаю исключение, что он не может быть преобразован.

Как я могу этого добиться?Дайте мне знать, если мне понадобится добавить здесь дополнительную информацию.Заранее спасибо.

1 Ответ

2 голосов
/ 14 января 2012

Вы должны ознакомиться с Managed Extensibility Framework (MEF). Это делает выполнение того, что вы хотите сделать, намного проще и избавляет вас от необходимости беспокоиться о доменах приложений и различных сборках.

Edit:

Если вы хотите использовать отражение только для достижения того, чего хотите, для этого потребуется гибкая объектная модель в вашем приложении. Основой этого подхода является то, что MEF делает под капотом. Вы действительно можете это сделать из .Net remoting, поэтому я бы посоветовал вам прочитать об этом.

Что вам понадобится:

  • Ваша заявка в (сборка А).

  • Сборка со старым кодом класса (сборка C).

  • Класс Remote Loader, который будет выступать в качестве вашего прокси / удаленного для второго AppDomain.

  • Прокси-класс, который будет представлять экземпляр старой версии класса.

  • Сборка B, которая будет содержать ваш прокси-класс и удаленный загрузчик.

Вот что вы можете попробовать:

  1. Загрузка приложения из сборки A.

  2. Создание нового экземпляра AppDomain.

  3. Создание экземпляра вашего класса "Удаленный загрузчик" в новом домене приложений из сборки B.

    а. Это приведет к загрузке сборки B в домен приложений.

  4. Из вашего «Удаленного загрузчика» загрузите сборку C и создайте экземпляр старого класса, а затем передайте экземпляр прокси-класса в исходный домен приложения.

  5. Теперь, мы надеемся, вы можете изменить ваши методы так, чтобы они принимали более общую версию объекта (возможно, интерфейс?), Которую прокси и ваша новая версия класса могут реализовать одновременно.

...