Кастинг ошибки с отражением

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

Я имею следующую строку кода, предполагаю, что IPlugin является моим интерфейсом.

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)

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

Исключение = Система. InvalidCastException: Не мог бросить объект типа ‘Система. Время выполнения. Дистанционная работа. ObjectHandle’ для ввода ‘MyNamespace. Компоненты. Интеграция. IPlugin’. в MyNamespace. Компоненты. Интеграция. PluginProxy.. ctor (Int32 instanceId)

Какие-либо идеи, что могло вызвать это?

7
задан Mitchel Sellers 13 April 2010 в 21:14
поделиться

2 ответа

Исключение указывает на то, что вы получаете ObjectHandle , что говорит о том, что ваш объект маршалируется и его необходимо развернуть.

Попробуйте следующее

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly,  Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
12
ответ дан 6 December 2019 в 09:59
поделиться

Как видно из документации , эта перегрузка возвращает объект ObjectHandle , который является оболочкой для нового экземпляра.

Объект ObjectHandle нельзя передать напрямую в ваш интерфейс.
Вместо этого вам нужно вызвать метод Unwrap , например:

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();
7
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: