Проблема с динамической загрузкой dll в мою программу - PullRequest
2 голосов
/ 07 мая 2009

Я пытаюсь добавить плагины к моей программе, и это выглядит хорошо, за исключением того, что я не могу привести правильный тип из библиотеки DLL. У меня есть решение с несколькими проектами на нем. Одним из проектов является слой страны, который фактически содержит CountryBase (определяется как открытый абстрактный класс CountryBase: CountryLayers.ICountryBase) Интерфейс (открытый интерфейс ICountryBase)

По другому проекту у меня есть «Реализация» для страны. Эта DLL загружается во время выполнения, используя это:

            Assembly assembly = Assembly.LoadFrom(file);
            //get the class from the assembly
            foreach (Type t in assembly.GetTypes())
            {
//just for debugging
                Console.WriteLine(t.FullName);
            }

            Type localType = assembly.GetType( "CountryLayers.Local");
            if (localType != null)
            {
                Country countrydata = new Country();
                countrydata.ObjectType = localType;
                countrydata.CountryObject  = Activator.CreateInstance(localType);
                countrydata.CountryObject2 = (CountryBase) countrydata.CountryObject;
                countrydata.FileName = file;
                CountryList.Add(countrydata);
            }

Где Local - это имя класса, определенного как открытый класс Local: CountryLayers.CountryBase, CountryLayers.ICountryBase

countrydata просто содержит указатель. CountryObject2 определяется как CountryBase (я также пытался использовать IcountryBase). Но всегда возвращалось, что тип не конвертируемый.

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

Итак, на данный момент я не знаю, произошла ли ошибка из-за того, что у меня все в одном решении, или проблема в том, что я использую интерфейс и абстрактный класс в неправильном порядке. Кроме того, когда create instance возвращает объект, этот объект имеет все свойства, определенные в абстрактном классе, но не имеет метода.

Ответы [ 2 ]

1 голос
/ 07 мая 2009

Я решаю это сам. Проблема возникает, когда вы компилируете все, используя решение. Таким образом, он создает dll для интерфейсов также в выходных данных других классов. Имея это в виду, я использовал папку плагинов для хранения плагинов и настроил VS для компиляции вывода в эту папку. Он копирует производный класс в эту папку вместе с dll интерфейса и dll абстрактной реализации. Так что это смутило компилятор. Я вынимаю каждую ссылку для проектов в VS (я изменяю их для ссылки на «скомпилированную» dll), я компилирую каждую dll по отдельности, а затем я только копирую dll, которая мне нужна, в папку плагина, и работаю. Так или иначе эта ссылка дала мне подсказку о проблеме: Динамическая загрузка с отражением

0 голосов
/ 07 мая 2009

В прошлом я сталкивался с подобной ситуацией, когда загружаемая вами dll динамически ссылалась на другую версию dll, содержащую базовый класс (я думаю, в вашем случае CountryBase).

...