У меня есть приложение, которое использует плагины, которыми управляют через интерфейс, я затем динамично загружаю сменные классы и бросаю их к интерфейсу для работы с ними.
Я имею следующую строку кода, предполагаю, что IPlugin является моим интерфейсом.
IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)
Это должно быть довольно просто, создать экземпляр и бросить его к интерфейсу. Я знаю, что блок и полностью определенные значения имени корректны, но я получаю следующее исключение.
Исключение = Система. InvalidCastException: Не мог бросить объект типа ‘Система. Время выполнения. Дистанционная работа. ObjectHandle’ для ввода ‘MyNamespace. Компоненты. Интеграция. IPlugin’. в MyNamespace. Компоненты. Интеграция. PluginProxy.. ctor (Int32 instanceId)
Какие-либо идеи, что могло вызвать это?
Исключение указывает на то, что вы получаете ObjectHandle
, что говорит о том, что ваш объект маршалируется и его необходимо развернуть.
Попробуйте следующее
ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly, Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
Как видно из документации , эта перегрузка возвращает объект ObjectHandle
, который является оболочкой для нового экземпляра.
Объект ObjectHandle
нельзя передать напрямую в ваш интерфейс.
Вместо этого вам нужно вызвать метод Unwrap
, например:
IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();