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

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

30.08.2017, 10:35. Показов 4102. Ответов 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
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 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
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 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
13110 / 7670 / 1674
Регистрация: 25.05.2015
Сообщений: 23,382
Записей в блоге: 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
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 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
18279 / 14202 / 5368
Регистрация: 17.03.2014
Сообщений: 28,883
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru