Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!
Помогите, пожалуйста, решить проблему. Я пишу консольную программку, которая загружает из определённой папки 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2014, 23:13
Ответы с готовыми решениями:

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

Содержимое корневого каталога логического диска А
помогите написать программу, выводящую содержимое корневого каталога логического диска А! ПОЖАЛУЙСТА!!!

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

8
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 07:10
Цитата Сообщение от VLDL Посмотреть сообщение
Файлы сборки лежат не в корневой папке где exe, а в отдельной, для плагинов(Plugins\plugins1\Plugins1.dll и Plugins\Plugins2\Plugins2.dll)
Событие AssemblyResolve поможет с подгрузкой зависимостей.
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 08:48  [ТС]
Спасибо, за ответ. Не понимаю как использовать это событие не для текущего домена. Оно вроде только помогает для загрузки в AppDomain.CurrentDomain. Нет?
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
28.05.2014, 10:41
Цитата Сообщение от 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  [ТС]
Ага, ответ правильный, спасибо. Я уже как раз так сделал)
прописал в конфиге <probing privatePath="Plugins"/>
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 11:13
В основной домен тоже загрузится ссылка А что касается AssemblyResolve, мороки тьма, по интернету несколько решений видел, но что-то мне подсказывает, что оно того не стоит...
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 11:17  [ТС]
Понятно) Но, к сожалению, оно того стоит... Не надо чтоб грузилось в текущий домен. Про AssemblyResolve я приемлемых решений не нашел(
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 11:18
VLDL, если можно, поподробнее расскажите про задачу? Плагин-то он плагин, но без особой связи с основным приложением - какой-то странный плагин
0
0 / 0 / 0
Регистрация: 27.05.2014
Сообщений: 5
28.05.2014, 11:28  [ТС]
Это пока не совсем плагин
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2014, 11:28
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru