Ошибка приведения с отражением - PullRequest
7 голосов
/ 14 апреля 2010

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

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

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

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

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

Есть идеи, что может вызвать это?

Ответы [ 2 ]

12 голосов
/ 14 апреля 2010

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

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

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly,  Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
7 голосов
/ 14 апреля 2010

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

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

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...