2010-04-13 3 views
7

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

У меня есть следующая строка кода, предположим, что IPlugin - это мой интерфейс.

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

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

Exception = System.InvalidCastException: Невозможно отлитого объекта типа «System.Runtime.Remoting.ObjectHandle» ввести «MyNamespace.Components.Integration.IPlugin». на MyNamespace.Components.Integration.PluginProxy..ctor (Int32 INSTANCEID)

Любые идеи, что может привести к этому?

ответ

12

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

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

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly, Info.FullyQualifiedName); 
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap(); 
7

Как вы можете видеть в documentation, эта перегрузка возвращает ObjectHandle object, которая обертывает новый экземпляр.

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

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap(); 
+0

не будет ему нужно бросить в 'ObjectHandle' первых, для того, чтобы' Unwrap() '? – Jay

+0

@Jay: Нет; он объявляется как возвращающий 'ObjectHandle'. Прочтите документацию. – SLaks

Смежные вопросы