Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2014, 23:30   #1
VLDL1
Новичок
Джуниор
 
Регистрация: 27.05.2014
Сообщений: 7
По умолчанию Загрузка dll не из корневого каталога

Всем привет!
Помогите, пожалуйста, решить проблему. Я пишу консольную программку, которая загружает из определённой папки dll-файлы. В каждом из dll есть класс, который реализует интерфейс IPlugin, и наследуется от MarshalByRefObject. Необходимо учесть 3 нюанса:
  1. Необходимо загружать в разные AppDomain
  2. Файлы сборки лежат не в корневой папке где exe, а в отдельной, для плагинов(Plugins\plugins1\Plugins1. dll и Plugins\Plugins2\Plugins2.dll)
  3. Не известно зарание структура dll. Т.е. нельзя хардкодить неймспейс и класс, как показано ниже:
    Код:
    var plugin = (IPlugin)domain.CreateInstanceFromAndUnwrap(pathToDll, "PluginNamespace.Plugin1");
Пробовал загружать через метод Load:
Код:
                        var domain = AppDomain.CreateDomain("NewDomain");
                        var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
Так работает только для сборок, которые лежат на одном уровне с ехе(не выполняется второе условие). Для dll внутри каталогов вылетает ошибка Could not load file or assembly...
На MSDN прочитал, что если сборки не рядом с ехе, то domain.Load не подходит, нужно использовать CreateInstanceFromAndUnwrap. С ним работает, но в него нужно передавать неймспейс и класс из сборки, а я его не знаю(3 условие). Знаю только что он реализует интерфейс IPlugin.
Помогите, пожалуйста, подскажите можно ли вообще при таких условиях загрузить сборки? Если можно то как??
--
С уважением, Виктор

Последний раз редактировалось VLDL1; 28.05.2014 в 00:29.
VLDL1 вне форума Ответить с цитированием
Старый 27.05.2014, 23:44   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

я может чего не понял... но не это ли вам надо
http://msdn.microsoft.com/en-us/libr...v=vs.110).aspx
eval вне форума Ответить с цитированием
Старый 27.05.2014, 23:54   #3
VLDL1
Новичок
Джуниор
 
Регистрация: 27.05.2014
Сообщений: 7
По умолчанию

Спасибо за ответ! Но я задаю PrivateBinPath через AppDomainSetup:
Код:
                   var appSetup = new AppDomainSetup()
                    {
                        ApplicationName = "PluginsDomain",
                        PrivateBinPath = pluginsFolder
                    };
Эту статью я просматривал. Нужно без конфигурационного файла.
VLDL1 вне форума Ответить с цитированием
Старый 28.05.2014, 00:01   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

это не важно конфиг или код, важно что вы туда кидаете
eval вне форума Ответить с цитированием
Старый 28.05.2014, 00:29   #5
VLDL1
Новичок
Джуниор
 
Регистрация: 27.05.2014
Сообщений: 7
По умолчанию

Путь к длл можно указать и в коде, как я показал(и именно эта настройка работает, длл ищутся там, где надо). Если я переделаю на конфиг - это не решит проблему)
Текущий вариант такой:
Код:
  
                  var files = Directory.GetFiles(path, "*.dll");
                    var appSetup = new AppDomainSetup()
                    {
                        ApplicationName = "PluginsDomain",
                        PrivateBinPath = pluginsFolder,
                        PrivateBinPathProbe = pluginsFolder
                    };

                    foreach (string file in files)
                    {
                        AssemblyName an = AssemblyName.GetAssemblyName(file);
                        var domain = AppDomain.CreateDomain("NewDomain", null, appSetup);
                        var plugin = (IPlugin)domain.CreateInstanceFromAndUnwrap(file, "PluginNamespace.Plugin1");
Но здесь, я указываю явно неймспейс и класс в длл, а я бы хотел найти решение без хардкода. Как при:
Код:
     
                    var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
(С)
VLDL1 вне форума Ответить с цитированием
Старый 28.05.2014, 00:31   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

вроде ж по русски пишу, неважно где важно что
eval вне форума Ответить с цитированием
Старый 28.05.2014, 00:45   #7
VLDL1
Новичок
Джуниор
 
Регистрация: 27.05.2014
Сообщений: 7
По умолчанию

Сейчас попробую, спасибо за помощь!
Чтоб создать конфиг для MainApp.ехе нужно его просто назвать как MainApp.ехе.config?
VLDL1 вне форума Ответить с цитированием
Старый 28.05.2014, 00:48   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

опять 25... при чем тут конфиг?
я вас спрашиваю какие пути вы указываете?
eval вне форума Ответить с цитированием
Старый 28.05.2014, 00:53   #9
VLDL1
Новичок
Джуниор
 
Регистрация: 27.05.2014
Сообщений: 7
По умолчанию

Код:
            var pluginsFolder = AppDomain.CurrentDomain.BaseDirectory + "Plugins";
            try
            {
                foreach (var path in Directory.GetDirectories(pluginsFolder))
                {
                    var files = Directory.GetFiles(path, "*.dll");
                    var appSetup = new AppDomainSetup()
                    {
                        ApplicationName = "PluginsDomain",
                        PrivateBinPath = pluginsFolder
                    };

                    foreach (string file in files)
                    {
                        var domain = AppDomain.CreateDomain("NewDomain", null, appSetup);
                        var p = (IPlugin)domain.CreateInstanceFromAndUnwrap(file, "CLIPlugin.CLIPlugin");
                         Console.WriteLine(p.Version);


                        AppDomain.Unload(domain);
                    }
                }
            }
в PrivateBinPath я указываю путь до папки Plugins включительно(она на одном уровне с ехе). В ней лежат папки с плагинами SharpPlugin\SharpPlugin.dll и CLIPlugin\CLIPlugin.dll
Этот код распознает CLIPlugin.dll, потому что в CreateInstanceFromAndUnwrap она хардкоднута. А SharpPlugin.dll, естественно, потом не находит...

Последний раз редактировалось VLDL1; 28.05.2014 в 00:56. Причина: пояснение
VLDL1 вне форума Ответить с цитированием
Старый 28.05.2014, 08:41   #10
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А через Reflection не проще будет?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт работает только из index.php корневого каталога xakil PHP 4 24.02.2011 14:25
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Содержимое корневого каталога Артём89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.06.2009 18:58
Чтение корневого каталога с дискеты alien9356 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 12.06.2009 17:22
загрузка .dll blackstersl Общие вопросы Delphi 1 29.04.2009 21:53