Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086

Динамическая загрузка Dll из ресурсов и ее использование

30.08.2017, 10:35. Показов 4038. Ответов 10
Метки нет (Все метки)

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


для теста скачал dotnetzip (Ionic.Zip.dll) добавил ее в ресурсы запаковывать не стал

пример использования

C#
1
2
3
4
5
6
using Ionic.Zip;
using (ZipFile zip = ZipFile.Read(ExistingZipFile))
            {
               ZipEntry e = zip["MyReport.doc"];
               e.Extract(OutputStream);
            }

C#
1
2
3
4
5
6
7
8
9
10
private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
                // Загрузка  сборки из ресурсов.
                using (var resource = new MemoryStream(Resources.Ionic_Zip))
                using (var reader = new BinaryReader(resource))
                {
                    int bufLength = Convert.ToInt32(resource.Length);
                    var buffer = reader.ReadBytes(bufLength);
                    return Assembly.Load(buffer);
        }

C#
1
2
3
4
private void Form1_Load(object sender, EventArgs e)
        {
            AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve;
        }
Вот как обратиться к этой DLL и использовать методы из нее?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.08.2017, 10:35
Ответы с готовыми решениями:

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

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

Загрузка ресурсов из dll
Создал библиотеку в библиотеке три папки с изображениями, библиотека подключена к другому проекту. Как загрузить эти изображения в проект? ...

10
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
30.08.2017, 11:08
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Вот как обратиться к этой DLL и использовать методы из нее?
Также как и до внедрения сборки в ресурсы. В этом и состоит суть метода и его удобство - код использующий внешную сборку никак не меняется.

Цитата Сообщение от EVG-1980 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
        private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
                // Загрузка  сборки из ресурсов.
                using (var resource = new MemoryStream(Resources.Ionic_Zip))
                using (var reader = new BinaryReader(resource))
                {
                    int bufLength = Convert.ToInt32(resource.Length);
                    var buffer = reader.ReadBytes(bufLength);
                    return Assembly.Load(buffer);
        }
Здесь много ненужных операций. Можно короче:
C#
1
2
3
4
5
        private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
                // Загрузка  сборки из ресурсов.
                return Assembly.Load(Resources.Ionic_Zip);
        }
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
30.08.2017, 11:33  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Также как и до внедрения сборки в ресурсы. В этом и состоит суть метода и его удобство - код использующий внешную сборку никак не меняется.
Не пойму, можно пример ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
30.08.2017, 12:31
EVG-1980, пример чего? Код для работы с Ionic у тебя есть. Статья с подробным описанием тоже. Что еще нужно?

P.S. В обработчике AssemblyResolve нужно не забывать проверять имя сборки.
C#
1
2
3
4
5
6
7
8
9
private static Assembly AppDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name.Contains("Ionic"))
    {
        // Загрузка  сборки из ресурсов.
        return Assembly.Load(Resources.Ionic_Zip);
    }
    return null;
}
0
Эксперт .NET
 Аватар для Rius
13026 / 7591 / 1661
Регистрация: 25.05.2015
Сообщений: 23,090
Записей в блоге: 14
30.08.2017, 12:40
EVG-1980, пример https://www.cyberforum.ru/blog... g4705.html
Вы тоже считаете, что поставка программы в виде одного EXE будет удобнее, чем EXE + DLL?
1
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
30.08.2017, 12:46  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
EVG-1980, пример чего? Код для работы с Ionic у тебя есть. Статья с подробным описанием тоже. Что еще нужно?
Я все равно не пойму как обратиться к этой загруженной сборке и использовать методы которые находятся в DLL поэтому и прошу пример кода
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
30.08.2017, 12:50
Лучший ответ Сообщение было отмечено EVG-1980 как решение

Решение

EVG-1980, 1) добавляем reference на сборку и ставим в свойствах Copy Local = False чтобы сборка не копировалась в выходной каталог
2) Добавляем сборку в ресурсы и подписываемся на событие AssemblyResolve чтобы на этапе исполнения сборка загружалась из ресурсов
3) Пишем код использующий типы из сборки точно так же как мы бы писали в случае обычного reference
4) Запускаем приложение
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
30.08.2017, 13:31  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
1) добавляем reference на сборку
Вот оно что михалыч, а я то думал надо будет делать что то типа этого
C#
1
2
3
4
5
6
7
8
9
10
11
12
        Assembly asm = Assembly.Load("");
         
        Type t = asm.GetType("", true, true);
         
        // создаем экземпляр класса Program
        object obj = Activator.CreateInstance(t);
         
        // получаем метод 
        MethodInfo method = t.GetMethod("");
         
        // вызываем метод, передаем ему значения для параметров и получаем результат
        object result = method.Invoke(obj, new object[] { });
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
30.08.2017, 15:07  [ТС]
Откуда берется квадратик????

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            using (ZipFile zip = new ZipFile(Encoding.UTF8))
            {
                zip.AddFile("base.csv");
                zip.Save("base.zip");
            }
 
            var options = new ReadOptions
            {
            StatusMessageWriter = System.Console.Out,
            Encoding = Encoding.UTF8
            };
 
            MemoryStream OutputStream;
            using (ZipFile zip = ZipFile.Read("base.zip", options))
            {
                ZipEntry ee = zip["base.csv"];
                using(OutputStream = new MemoryStream()) ee.Extract(OutputStream);
            }
 
            MessageBox.Show(System.Text.Encoding.UTF8.GetString(OutputStream.ToArray()));
C#
1
2
3
     string[] lines = File.ReadAllLines("base.csv", System.Text.Encoding.UTF8);
 
            MessageBox.Show(lines[0]);
Миниатюры
Динамическая загрузка Dll из ресурсов и ее использование  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
30.08.2017, 15:19
Лучший ответ Сообщение было отмечено EVG-1980 как решение

Решение

EVG-1980, это наверняка BOM - Byte Order Mark - несколько байтов с помощью которых определяется схема кодирования Unicode: UTF8, UTF16, UTF32. Самый простой способ пропустить её это использование StreamReader
C#
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
            string text;
            using (ZipFile zip = ZipFile.Read("base.zip", options))
            {
                ZipEntry ee = zip["base.csv"];
                using(var OutputStream = new MemoryStream())
                {
                    ee.Extract(OutputStream);
                    OutputStream.Position = 0;
                    using (var reader = new StreamReader(OutputStream))
                    {
                        text = reader.ReadToEnd();
                    }
                }
            }
 
            MessageBox.Show(text);
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
30.08.2017, 15:22  [ТС]
Помогло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.08.2017, 15:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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