Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 2
Регистрация: 06.12.2009
Сообщений: 51
1

Динамическая загрузка DLL, сборки и домены

18.06.2015, 11:56. Показов 1924. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сделал по этой статье http://habrahabr.ru/post/247615/ приложение которое все необходимые для своей работы ДЛЛ содержит внутри себя как сжатые gzip'ом файлы
Основная идея там заключена в следующем коде:
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
static class Program
{
    static Program()
    {
        //подписыаемся на событие ошибки резолва сборок во время работы
        //что бы потом самим грузить их из ресурса экзешника
        AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
        {
            //пока что не важно что тут происходит. Важно что неким образом получаем сборку в виде массива байтов
            String resourceNameComp = "[ReferencdeNameSpace].lib." + new AssemblyName(args.Name).Name + ".dll.compressed";      
            var a = Assembly.GetAssembly(typeof(MainWindow));
            var streamComp = a.GetManifestResourceStream(resourceNameComp);
            Byte[] assemblyDataComp = new Byte[streamComp.Length];
            streamComp.Read(assemblyDataComp, 0, assemblyDataComp.Length);
            assemblyDataComp = Compress.Compressor.ConvertBytes(assemblyDataComp);
            
            //и из массива байтов возвращаем сборку
            var res = Assembly.Load(assemblyDataComp);
            return res;
        };
 
    }
 
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainWindow());
 
    } 
}
В виде ЕХЕшника приложение работает нормально. Но теперь потребовалось, что бы по сути все приложение компилировалось в сборку и его формы можно было отображать в другом приложении.
При этом хотелось бы сохранить вот этот механизм внедрения без изменения стороннего приложения.
В качестве стороннего приложения пробовал использовать просто чистый проект (назовем его лаунчером), к которому в референсы присоединена моя сборока с внедренными ДЛЛ и лаунчеру нужно запустить
в качестве формы - форму из моей сборки. При этом форма эта нестандартная (от Devexpress) и соответственно для ее работы нужны dll. Если я в лаунчер добавлю только свою сборку и напишу
C#
1
2
//MainWindow - нестандартная форма из моей сборки
Application.Run(new MainWindow());
То этот лаунчер даже не понимает что MainWindow это по сути форма и ее действительном можно отобразить. Ладно добавляю в студию нужные ДЛЛ, но их не должно быть рядом с лаунчером в рантейме.
Они есть внутри моей сборки. Соответственно пытаюсь их в лаунчере получить по вот тому коду из примера следующим образом:
C#
1
2
3
4
5
//тут уже указывается в имени ресурса namespace связанной сборки моего приложения
String resourceNameComp = "[ReferencdeNameSpace].lib." + new AssemblyName(args.Name).Name + ".dll.compressed";  
//MainWindow определен опять таки в моей подключаемой сборке приложения, и получаем мы именно ее
var a = Assembly.GetAssembly(typeof(MainWindow));
var streamComp = a.GetManifestResourceStream(resourceNameComp);
В дебаге на машине где нужные сборки есть в GAC я вижу что вроде как я массив байтов ДЛЛ получаю из своей сборки, но когда из него создается Assembly, то у него Location идет из GAC и свойство GlobalAssemblyCache идет true; На машине где их нет в GAC выбивает ошибку, что не найдена нужная ДЛЛ.
Причем заметил, что лаунчеру нужны только ДЛЛ которые описывают именно вот эту форму сторонюю. Т.е. например на этой форме есть NavBar, который требует свою ДЛЛ. Если рядом с лаунчером я положу ДЛЛ которые описывают форму без ДЛЛ для этого NavBar, то он ее отобразит нормально! Т.е. ДЛЛ для NavBar он таки находит внутри моей сборки.
Вопрос в том почему так происходит? Я не совсем понимаю архитектуру доменов, сборок и т.д. Подозреваю что именно в этом проблема, что сборки загружаются для моей стороней бибилиотеки с формами (поэтому не нужны ДЛЛ для NavBar), но не загружаются для лаунчера (поэтому нужны ДЛЛ описывающие эту нестандартную форму)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2015, 11:56
Ответы с готовыми решениями:

Динамическая загрузка DLL
Добрый день, есть DLL написанная на Delphi: library Project1; uses System.SysUtils, ...

Динамическая загрузка dll
Есть dll с кодом using System; using System.Collections.Generic; using System.Linq; using...

Динамическая загрузка из управляемой DLL
Есть основное приложение, во время работы которого, необходимо динамически, по необходимости, ...

Динамическая загрузка Dll из ресурсов и ее использование
Пытаюсь разобраться для себя , прошу помощи сделал как в статье https://habrahabr.ru/post/85480/ ...

1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
18.06.2015, 18:01 2
Цитата Сообщение от troika Посмотреть сообщение
Основная идея там заключена в следующем коде:
Ну уж нет, я конечно бегло просмотрел код по ссылке, но именно такой идеи там я не увидел.
Там основная идея - подгрузка сборок из ресурсов как массива байт (с расшифровкой или без, не суть важно). Но естественно, тот пример не предполагает наличие в проекте изначальной ссылки на эту сборку, то есть используется чистая рефлексия типов.
В вашем же случае, вы хотите иметь добавленную ссылку, но наличие самой библиотеки рядом с проектом не предполагается, вы хотите загружать ее из ресурсов.
0
18.06.2015, 18:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2015, 18:01
Помогаю со студенческими работами здесь

Динамическая загрузка dll и использование ее через интерфейс
Есть интерфейс, есть библиотека классов с классом от этого интерфейса, есть клиентское приложение,...

Синхронная динамическая загрузка .DLL в нескольких потоках, возможно ли?
Есть библиотека на .NET При синхронном вызове функций библиотеки из нескольких потоков моего...

Динамическая загрузка dll
Хочу использовать https://github.com/naudio/Vorbis для которго нужно подключить...

Зависимость от других DLL и динамическая их загрузка
При компиляции DLL было использовано 5 других DLL ( References ). Скриншот: Что надо...


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

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