Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.66
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
#1

Включение dll внутрь exe - C#

31.05.2013, 19:46. Просмотров 13605. Ответов 17

как подключить управляемую библиотеку, при этом включив ее сразу в exe, чтобы не пришлось ее таскать вслед за exe? Можно ли это сделать без ILmerge? Как?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2013, 19:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Включение dll внутрь exe (C#):

.NET 3.x Как притулить метод на выполнение с DLL , без ошибочного завершения как DLL не будет c EXE - C#
Как притулить метод на выполнение с DLL , без ошибочного завершения как DLL не будет c EXE using System; using...

Упаковать exe и dll в один exe файл - C#
Добрый день! Для защиты использую IlProtector. На выходе получается exe и 2 dll. Я хочу упаковать эти три файла в один exe. Что для...

Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку - C#
Подскажите, как должен выглядеть код простейшей программы на C# (Loader.exe), которая бы загружала под собой исполняемый файл (Prog.dll),...

.NET 4.x Dll to exe - C#
Здравствуйте,помогите новичку который не понимает как сделать данное дело. Вообщем имеется: dll файл-Ionic.Zip.dll exe файл-user.exe ...

exe=>dll - C#
у меня имееться обычный проект на си шарпе как из него сделать dll -ку ,заранее спасибо

Соединить .dll и .exe - C#
Подключил библиотеку "Ionic.Zip" после построения проекта переместил .exe файл в другую папку и удивился, так как он не заработал, потом...

17
Conrad
31 / 31 / 1
Регистрация: 26.02.2011
Сообщений: 83
31.05.2013, 19:59 #2
Правой кнопкой по проекту Visual Studio, выбираешь Project Properties -> Resources -> Add Resource -> Add Existing File… И добавляешь следующий код в App.xaml.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
 
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");
 
    dllName = dllName.Replace(".", "_");
 
    if (dllName.EndsWith("_resources")) return null;
 
    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
 
    byte[] bytes = (byte[])rm.GetObject(dllName);
 
    return System.Reflection.Assembly.Load(bytes);
}
2
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
31.05.2013, 20:05  [ТС] #3
спасибо, а как же потом к этой библиотеке обращаться? using надо ведь использовать, или это если только есть ссылка?
А в свойствах файла что-нибудь менять?
0
beats
98 / 36 / 4
Регистрация: 09.12.2012
Сообщений: 567
31.05.2013, 20:34 #4
да в ресурсы с типом разное добавляешь ее, потом в byte[] переменную считываешь и создаешь файл из этой переменной, а обращение по пути. при закрытии проги можно удалить
1
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
31.05.2013, 20:58  [ТС] #5
аааа ладно, попробуем

Добавлено через 17 минут
а что за App.xaml.cs?
0
phantom96
MЫW
124 / 109 / 1
Регистрация: 15.02.2013
Сообщений: 538
31.05.2013, 21:33 #6
В винформах Program.cs
1
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
01.06.2013, 12:08  [ТС] #7
а как создавать типы из библиотеки?

Добавлено через 6 минут
Мне же придется проделывать GetType() для каждого типа, который я захочу использовать? А можно ли создавать типы из такой библиотеки непосредственно, как если бы она была объявлена в ссылках?

Добавлено через 5 минут
а методы придется инвокать? Как это отразится на производительности?
0
kill4you
0 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 11
01.06.2013, 13:50 #8
Выгрузил либу рядом с программой и заюзал, в чем проблема то?
0
Dexiny
170 / 87 / 3
Регистрация: 27.05.2013
Сообщений: 290
01.06.2013, 14:14 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ох и насоветуют. Не надо никаких GetType(), если библиотека managed.

1)Добавляем библиотеку в References. В Solution Explorer (колонка с файлами справа) правой кнопкой мыши по References - выбираем "Add Reference...", вкладка Browse, выбираем dll, ОК.
2)Открываем список References всё в том же Solution Explorer (просто клик левой кнопкой мыши), находим нашу подключенную библиотеку. Кликаем правой кнопкой мыши и выбираем Properties. Устанавливаем параметр "Copy Local" в False. Всё теперь в коде пишем using MyDll; и пользуемся классами библиотеки.
3)Добавляем в ресурсы файл *.dll. В меню Project > Properties > Resources > жмакаем Add Resource > выбираем снова нашу длл (либо сжатую длл архиватором)> Ok. Всё теперь появится в проекте папка Resources. Следите чтобы у ресурсов стояла опция "Copy to Output Directory" в положении Do not copy.
4)В файлик App.cs или App.xaml.cs (у кого как) добавляем код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class App : Application
    {
        public App() : base()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }
        System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name.Contains("Dll_Reference_Name"))
            {
                return Assembly.Load(PROJECT_NAME.Properties.Resources.DLL_FILE_NAME);
            }
        }
    }
"Dll_Reference_Name" - точно такое же название, которое используете в using.
PROJECT_NAME - название вашего проекта, ваш namespace
DLL_FILE_NAME - название файла, который вы пихали в Resource

Более опытные могут хранить ресурсы в сжатом виде и распаковывать стрим перед извлечением, тогда размеры *.exe файла будут в 2-3 раза меньше.

Примечание: РЯДОМ С ФАЙЛОМ *.EXE БИБЛИОТЕКИ БЫТЬ НЕ ДОЛЖНО, ИНАЧЕ ЗАГРУЗКА С РЕСУРСОВ НЕ СРАБОТАЕТ!!!

Добавлено через 5 минут
В функции CurrentDomain_AssemblyResolve ещё в конце припишите return null; забыл скопипастить
13
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
01.06.2013, 15:40  [ТС] #10
сейчас попробую...

Добавлено через 15 минут
что то не понятно, куда вставлять код - у меня есть только статический класс Program, никакого app.cs...
при запуске пишет, что не удается загрузить сборку - файл не найден.
0
Dexiny
170 / 87 / 3
Регистрация: 27.05.2013
Сообщений: 290
01.06.2013, 15:41 #11
Вот сделал пример использования встроенных библиотек, а также использование бесплатной библиотеки 7Zip для сжатия ресурсов программы методом lzma, причём всё внутри exe файла. Для своего удобства программу писал на WPF.
0
Вложения
Тип файла: rar InternalZippedDLL.rar (401.8 Кб, 332 просмотров)
WWWinplex
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
01.06.2013, 17:13  [ТС] #12
спасибо, у меня все почти так же, только не на wpf - до запуска приложения дело, похоже, не доходит - вываливается исключение "Невозможно загрузить сборку" или что-то типа этого и затем "заставка" - нет доступных исходных файлов...
0
уни
327 / 106 / 14
Регистрация: 06.03.2010
Сообщений: 230
16.08.2013, 03:09 #13
Вот тут есть пример стандартного способа загрузки dll из ресурсов через Assembly.Load(): Plugin.cs.

1. [BindingFlags.Instance] Метод Unzip() использует находящуюся в ресурсах библиотеку ICSharpCode.SharpZipLib.dll, которая распаковывает zip-архив, тоже находящийся в ресурсах.

Там же пример загрузки смешанной dll через Assembly.LoadFile():

2. [BindingFlags.Static] После распаковки в папке появляется другая dll (С++/CLI). Из неё тоже подгружается класс, но используются уже его статические методы и поля.

Смешанную dll (C++/CLI) нельзя загрузить прямо из ресурсов (при этому будет возникать исключение). Парни из Microsoft объяснили, что такая возможность поддерживаться не будет из-за проблем с безопасной инициализацией образа такой dll.
1
Miron50
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 1
18.02.2014, 19:45 #14
Маялся со схожей проблемой, есть несколько похожих проектов повторяющиеся методы вынесены наружу. Смержил их в один солюшен, но лень при рефакторинге в каждый ходить и менять код. Ответ подсказали программисты.
Итак:
1. библиотеку создаем отдельным проектом как обычный cs файл(НЕ как либу в этом же солюшене).
2. Подключаем её к нашему проекту Add->Existing Item-> здесь выбираем файл cs в котором нужный вам код(главное указать тип подключения "Add As Link") .
Все, и да будет Вам радость.
0
melhior4eg
0 / 0 / 0
Регистрация: 27.02.2014
Сообщений: 1
27.02.2014, 17:57 #15
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Код C#
public partial class App : Application
    {
        public App() : base()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }
        System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name.Contains("Dll_Reference_Name"))
            {
                return Assembly.Load(PROJECT_NAME.Properties.Resources.DLL_FILE_NAME);
            }
        }
    }
не работает способ в консольном приложении или что я не так делаю?

Добавлено через 2 часа 19 минут
Говорит что файл не найден... приложение не доходит до этого метода (не доходит до функции Main)

Добавлено через 1 час 48 минут
перекинул логику использующую подгружаемую библиотеку в отдельный файл класса и все заработало, проблема в том что это приложение должно было динамически компилироваться из другого приложения... поэтому все логика должна быть в одном файле... что делать?

Добавлено через 11 минут
Сам затупил, сам разобрался, логику использующую подгружаемую библиотеку просто не описывать в Main использовать отдельный класс и нет проблем

P.S.
Не пинайте сильно начинающего программиста, просто видимо надо было выговориться... почти день тупил над этим..
0
27.02.2014, 17:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2014, 17:57
Привет! Вот еще темы с ответами:

Импорт dll в exe - C#
Кто знает, как импортировать dllку в проект, чтобы не нужно было ее в папке с .exe потом держать и прога нормально запускалась на другом...

Объединить dll и exe - C#
Необходимо, чтобы программа была как один единственный экзешник, но проблема в том, что она зависима от dll ки. Так вот, никак не могу...

Внедрение dll в exe - C#
Здравствуйте. Пишу программу для получения пакетов с сетевой карты. Соответственно использую PcapDotNet (надстройка над Winpcap):...

Объединить exe и dll - C#
В проекте находится решение самой программы и решение dll ки. Как сделать чтобы при компиляции dllка внедрялась в проект? т.е. не нужно...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru