InvalidCastException при создании экземпляра с использованием Assembly.CreateInstance - PullRequest
0 голосов
/ 21 апреля 2010

Я ищу объяснение для следующего - У меня есть сборка, которую я загружаю, используя

Assembly assembly = Assembly.LoadFrom(filename);

Затем я зацикливаюсь на всех типах в сборке и хочу попытаться выяснить, реализует ли тип конкретный интерфейс и, если это так, я хочу экземпляр этого типа, я попробовал несколько вещей, которые не работали но когда я вернулся к самому базовому (и, вероятно, неэффективному) пути, я понял, что есть нечто более фундаментальное, чего я не понимаю -

            foreach (Type t in assembly.GetTypes())
            {
                foreach (Type i in t.GetInterfaces())
                {
                    if (i.FullName == pluginInterfaceType.FullName)
                    {
                        object o = assembly.CreateInstance(t.ToString());
                        IInterface plugin = (IInterface)o;

Эта последняя строка вызывает исключение InvalidCastException, несмотря на тот факт, что созданный тип определенно реализует этот интерфейс.

Еще больше - если я использую Activator.CreateInstance вместо Assembly.CreateInstance (что я не хочу делать), приведение к интерфейсу работает просто отлично.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Скорее всего, это потому, что интерфейс, к которому вы ведете каст, не тот, который вы видите в классе.

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

0 голосов
/ 21 апреля 2010

InvalidCastException должен содержать больше деталей, например, «не может привести x к y».
Я предполагаю, что сборка, содержащая IInterface, которую вы загружаете, не совсем совпадает с той, на которой был построен ваш код, может быть, это локальная копия сборки без строгого имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...