0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
1

Загрузка dll не из корневого каталога

27.05.2014, 23:13. Показов 2386. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Помогите, пожалуйста, решить проблему. Я пишу консольную программку, которая загружает из определённой папки dll-файлы. В каждом из dll есть класс, который реализует интерфейс IPlugin, и наследуется от MarshalByRefObject. Необходимо учесть 3 нюанса:
  1. Необходимо загружать в разные AppDomain
  2. Файлы сборки лежат не в корневой папке где exe, а в отдельной, для плагинов(Plugins\plugins1\Plugins1.dll и Plugins\Plugins2\Plugins2.dll)
  3. Не известно зарание структура dll. Т.е. нельзя хардкодить неймспейс и класс, как показано ниже:
    C#
    1
    
     var plugin = (IPlugin)domain.CreateInstanceFromAndUnwrap(pathToDll, "PluginNamespace.Plugin1");
Пробовал загружать через метод Load:
C#
1
2
3
                        var domain = AppDomain.CreateDomain("NewDomain");
                        var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
Так работает только для сборок, которые лежат на одном уровне с ехе(не выполняется второе условие). Для dll внутри каталогов вылетает ошибка Could not load file or assembly... Прочитал где-то, что можно использовать CreateInstanceFromAndUnwrap - с ним работает, но в него нужно передавать неймспейс и класс из сборки, а я его не знаю(3 условие). Знаю только что он реализует интерфейс IPlugin.
Помогите, пожалуйста, подскажите можно ли вообще при таких условиях загрузить сборки? Если можно то как??
--
С уважением, Виктор
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2014, 23:13
Ответы с готовыми решениями:

Вывод на экран корневого каталога
Доброго времени суток, как на С++ написать, чтобы вывело на экран содержимое корневого каталога....

Содержимое корневого каталога логического диска А
помогите написать программу, выводящую содержимое корневого каталога логического диска А!...

GParted и увеличение размера корневого каталога
Итак... Вообщем мне захотелось увеличить размер корневого каталога. Загрузился с LiveCD, запустил...

Вывести на экран количество подкаталогов у корневого каталога
1)Расширение состоит не более чем из 2 символов; 2)В имени буква c встречается более 3 раз; 3)В...

8
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 07:10 2
Цитата Сообщение от VLDL Посмотреть сообщение
Файлы сборки лежат не в корневой папке где exe, а в отдельной, для плагинов(Plugins\plugins1\Plugins1.dll и Plugins\Plugins2\Plugins2.dll)
Событие AssemblyResolve поможет с подгрузкой зависимостей.
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 08:48  [ТС] 3
Спасибо, за ответ. Не понимаю как использовать это событие не для текущего домена. Оно вроде только помогает для загрузки в AppDomain.CurrentDomain. Нет?
0
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
28.05.2014, 10:41 4
Цитата Сообщение от VLDL Посмотреть сообщение
Для dll внутри каталогов вылетает ошибка Could not load file or assembly...
попробуйте прописать в конфиг что-то типа этого, чтобы софтина искала либы в нужных каталогах

XML
1
2
3
4
5
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin\Plugins;bin\Plugins\zh-chs;bin\Plugins\zh-cht;bin\Plugins\de;bin\Plugins\es;bin\Plugins\fr;bin\Plugins\it;bin\Plugins\ja;bin\Plugins\ko"/>
    </assemblyBinding>
  </runtime>
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 11:10  [ТС] 5
Ага, ответ правильный, спасибо. Я уже как раз так сделал)
прописал в конфиге <probing privatePath="Plugins"/>
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 11:13 6
В основной домен тоже загрузится ссылка А что касается AssemblyResolve, мороки тьма, по интернету несколько решений видел, но что-то мне подсказывает, что оно того не стоит...
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 11:17  [ТС] 7
Понятно) Но, к сожалению, оно того стоит... Не надо чтоб грузилось в текущий домен. Про AssemblyResolve я приемлемых решений не нашел(
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 11:18 8
VLDL, если можно, поподробнее расскажите про задачу? Плагин-то он плагин, но без особой связи с основным приложением - какой-то странный плагин
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 11:28  [ТС] 9
Это пока не совсем плагин
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.IO;
using Interface;
 
namespace MainApp
{
    internal class Program
    {
      private static void Main(string[] args)
        {
            var folder = AppDomain.CurrentDomain.BaseDirectory;
            try
            {
                foreach (var path in Directory.GetDirectories(folder + "Plugins"))
                {
                    var files = Directory.GetFiles(path, "*.dll");
                    foreach (string file in files)
                    {
                        var domain = AppDomain.CreateDomain("NewDomain");
 
                        var buffer = File.ReadAllBytes(file);
                        var assembly = domain.Load(buffer);
 
                        foreach (var type in assembly.GetTypes())
                        {
                            var iface = type.GetInterface(typeof(IPlugin).Name);
 
                            if (iface != null)
                            {
                                var plugin = (IPlugin)Activator.CreateInstance(type);
                                Console.WriteLine(plugin.Version);
                            }
                        }
                        AppDomain.Unload(domain);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
            Console.ReadKey();
        }
    }
}
Текущий вариант такой + конфиг, где указан PrivatePath="Plugins". А само задание, я вроде, масимально подробно описал в первом сообщении. Есть 2 класса, которые реализуют интерфейс IPlugin и наследуются от MarshalByRefObject. Оба класса в отдельных проектах и интерфейс тоже в отдельном. Нужно в основном приложении их продгрузить и выполнить метод интерфейса(Version). Сборки лежат не около ехе, а в Plugins\Plugin1\Plugin1.dll и Plugins\Plugin2\Plugin2.dll. И загрузить их надо в разные домены) Если есть какие-то непонятки по задаче, могу пояснить)
0
28.05.2014, 11:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2014, 11:28
Помогаю со студенческими работами здесь

Невозможно отобразить картинки из корневого каталога сервера
Здравствуйте! При выгрузке страниц сайта и прилагающихся к ним картинок на сервер возникли...

Пошаговая установка Fedora Xfce 22. Выбор корневого каталога
Всем доброго дня. Я заядлый виндусятник, решила перейти на темную сторону, и установить себе Fedora...

Как правильно передать путь к файлу корневого каталога
Реализую в своей веб-службе возможность по нажатию кнопки запускать exe-файл на сервере....

Я могу построить ссылку только на файл в папке корневого каталога
Помогите, огромная просьба. Я могу построить ссылку только на файл в папке корневого каталога...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru