Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
4 / 4 / 1
Регистрация: 06.04.2011
Сообщений: 10
.NET 4.x

Загрузка сборки в домен из произвольного каталога

18.10.2011, 08:54. Показов 3800. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, хотел обратиться к Вам со следующей проблемой.
Генерирую две сборки с помощью встроенного C# компилятора кода. Первая запускаемая, а вторая с так называемыми вспомогательными пользовательскими функциями.
Проблема именно в том, чтобы загрузить их одновременно в домен, для возможности дальнейшей выгрузки, т.к. загруженную сборку можно выгрузить лишь выгрузив её домен. Загрузка сборок должна производиться из определенного каталога, который не связан с приложением (Допустим C:\Libraries). В этом главная проблема, потому что если положить сборки в каталог запускаемого приложения, то все загружается легко.

Запускаемая библиотека:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public partial class Runner
{
    public static string Run()
    {
        return "SomeMethod:" + ClassLib.SomeMethod();
    }
 
    public string GetVersion()
    {
        return "v01";
    }
}
C#
1
2
3
4
5
6
7
public class ClassLib //: MarshalByRefObject
{
    public static string SomeMethod()
    {
        return "Invoke SomeMethod";
    }
}
Перепробовал не мало способов, и мои пояснения. Поправьте, если я не прав.

Загрузка в текущий домен, что изначально не подходит, но все же привел его. Как я понял данным метод загружается вне контекста, где дополнительно невозможно загружать другие сборки
C#
1
Assembly assembly = Assembly.LoadFile(path_run);
Подписываюсь на событие при невозможности загрузки из каталога приложения. Обманный ход, но не работает.
C#
1
2
3
4
AppDomain ad = AppDomain.CreateDomain("sd");
ad.AssemblyResolve += delegate(object sender, ResolveEventArgs args) { return Assembly.LoadFile(args.Name); };
Assembly assembly = ad.Load(path_run);
Invoke(assembly);
Метод Invoke я произвожу поиск класса и его метода по сборке и потом запускаю. Что то вроде этого
C#
1
var result = assembly.GetType("TestInvoke.Run.Runner").GetMethod("Run").Invoke(null, null);
Метод CreateInstanceFromAndUnwrap. Как я понял, то необходимо объявлять через интерфейс, наследоваться от MarshalByRefObject и применение флага [Serializable]. Это работает, но жутко не удобно, потому что в реальном приложении объявления этого флага [Serializable] необходимо у 90% всех классов! o_O
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
AppDomain ad = AppDomain.CreateDomain("sd1");
try
{
    IRunner runner = (IRunner)ad.CreateInstanceFromAndUnwrap(
        Path.GetDirectoryName(path_run) + "\\TplRunerI.dll", 
        "TestInvoke.Run.Runner");
    object result = runner.GetVersion();
    Console.WriteLine(result as string);
}
finally
{
    AppDomain.Unload(ad);
}
Пробовал и с применением класса AppDomainSetup, в котором можно указать ApplicationBase - каталог с приложением, а именно там сначала проводится поиск необходимых сборок. Но как будто он не реагирует на это поле.

Вот мой тестовый проект.
ссылка удалена
 Комментарий модератора 
Saimon2k, залейте проект на форум (Расширенный режим -> Управление вложениями)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2011, 08:54
Ответы с готовыми решениями:

Как указать путь из другого каталога для загрузки DLL сборки
Добрый день ☺ Вопрос. Представим, что есть программа run.exe. В рабочем каталоге есть подкаталоги A и B. В них соответственно есть...

Вычислить размер произвольного, указанного каталога
Вычислить размер произвольного, указанного каталога нужно под дос на тасм

сменить домен, не выпав из яндекс-каталога
Хочу поменять домен сайта, находящегося в яндекс-каталоге. Не грозит ли это вылетом из каталога? Думаю менять так: сделать зеркало...

2
4 / 4 / 1
Регистрация: 06.04.2011
Сообщений: 10
18.10.2011, 12:02  [ТС]
Вот мой тестовый проект.
Вложения
Тип файла: zip TestInvoke_20111018_1057.zip (15.4 Кб, 27 просмотров)
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
18.10.2011, 16:58
Execute4() рабочий, вот только у net дллок нет точки входа (Main), ExecuteAssembly нечего там выполнять(о чем кстати говорит исключение)

Если нужно загрузить в другой домен сборку и использовать ее типы в своем придется юзать CreateInstanceAndUnwrap

А варианты с Assembly.LoadFile не работают как раз из-за ApplicationBase
нельзя загрузить сборку лежащую выше по каталогам(GAC отдельный случай), только из родного либо ниже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2011, 16:58
Помогаю со студенческими работами здесь

Копирование произвольного числа файлов, заданных аргументами, из текущего каталога в указываемый каталог
Добрый день, друзья! Нужно написать такой bat-ник, в написании пакетных файлов совсем не силен, но сделать надо... :cry: Помогите...

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

Загрузка сборки System.Threading
Я хочу получить список всех сборок, которые уже есть в AppDomain и которые могут быть загружены в будущем (на которые ссылается...

Загрузка сборки MetroFramework из ресурсов
Здаров! Кто знает про скин MetroFramework Можете подсказать начальную строку для подгрузки под сборку... Добавлено через 4 часа 21...

Динамическая загрузка DLL, сборки и домены
Сделал по этой статье http://habrahabr.ru/post/247615/ приложение которое все необходимые для своей работы ДЛЛ содержит внутри себя как...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru