у меня две сборки; AssemblyWithInterface
и AssemblyWithClass
. В AssemblyWithInterface
у меня есть интерфейс под названием IDoSomething
, который реализуется TheClass
в AssemblyWithClass
. (AssemblyWithClass
ссылки AssemblyWithInterface
.)
В AssemblyWithInterface
Я хочу создать экземпляры класса из AssemblyWithClass
, используя отражение:
var theAssembly = Assembly.Load("Company.AssemblyWithClass, { FQN... }");
var theConcreteClass = theAssembly.CreateInstance("Company.AssemblyWithClass.TheClass");
Сборка загружается нормально, и экземпляр создается как TheConcreteClass
.
Однако я не могу привести theConcreteClass
к его интерфейсу реализации. Я получаю InvalidCastException
здесь:
var theConcreteClassInterfaced = (IDoSomething)theConcreteClass;
И
var isAssignable = typeof(IDoSomething).IsAssignableFrom(theConcreteClass.GetType();
Неверно.
Чего мне не хватает? (Цель состоит в том, чтобы иметь возможность в стиле шаблона команд добавлять команды, реализующие IDoSomething
к AssemblyWithClass
, и иметь возможность выполнять их в AssemblyWithInterface
без изменения кода в AssemblyWithInterface
.)
Платформа - .NET 3.5 (не может использовать динамический).
Обновление:
Предпосылкой для этого вопроса (чтобы объяснить, почему я не соблюдаю DIP) является то, что у меня есть устаревшее ASP.NET-приложение, содержащееся в одной большой сборке. Я хочу создать сборку плагинов, которая может обращаться к различным частям устаревшей сборки, чтобы выполнять мониторинг и некоторые автоматизированные задачи. Я не хочу добавлять какие-либо дополнительные зависимости (ссылки на другие сборки) в устаревшую сборку. Идея состоит в том, чтобы реализовать хук в устаревшей сборке (новая специальная страница и IPlugInOperation), добавить страницу мониторинга с соответствующим кодом позади. Сделайте так, чтобы код выполнял различные IPlugInOperations (рисуя интерфейс, позволяющий администратору указывать параметры, которые будут использоваться для выполнения кода в устаревшей сборке). Сборка подключаемого модуля должна ссылаться на устаревшую сборку, а устаревшая сборка использует отражение, чтобы вывести список и позволить администратору оправдывать различные реализации IPlugInOperation, содержащиеся в сборке подключаемого модуля.