Пишу програмку на шарпе и столкнулся с такой проблемой: есть сторонняя библиотека, которую я кидаю в папку с проектом, подключаю пространство имён и всё работает как надо. НО! для того, чтобы эту программу перенести на другой ПК нужно копировать всю папку вместе с библиотеками. Вопрос: как можно все эти файлы уместить в конечный исполняемый файл, чтобы был 1 exе и не было надобности копировать всю папку?
Asked
Active
Viewed 357 times
2
-
4А что, это проблема? Ну используйте ILMerge. – VladD Dec 27 '16 at 19:39
-
А почему не сработало? В чём была проблема? – VladD Dec 27 '16 at 21:06
-
используйте GUI ILMerge там все просто - https://ilmergegui.codeplex.com/ – tCode Dec 27 '16 at 21:23
-
@FoggyFinder: Может, у вас была библиотека на C++/CLI или что-то ещё с неуправляемым кодом? Такое по идее должно быть сложнее смёржить. – VladD Dec 28 '16 at 07:09
-
1Есть программа "ILMerge", сам не пробовал, не было необходимости. На хабре отлично об этом рассказано https://habrahabr.ru/post/126089/ – Лазиз Эргашев Dec 27 '16 at 21:27
3 Answers
3
Можно создать setup.exe с помощью, например, Inoo Setup. Указываете ей папку, где у вас лежит всё (включая ваш exe), и она создает вам setup.exe, при запуске которого вылезет стандартный установщик, он и создаст на чужом компьютере вашу папку со всем необходимым. Правда, если в вашей папке есть вложенные папки, то там есть одна тонкость
Matty
- 717
- 4
- 16
3
Как это делаю я:
Добавляю сборку как обычный файл явно в проект.
Указываю сборке (пкм по ней, свойства) Build Action - Embedded Resource, Do not copy.
На запуске приложения подписываюсь на событие резолва сборок
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly.ResolveInternalAssembly; internal static Assembly ResolveInternalAssembly(object sender, ResolveEventArgs args) { var resource = args.Name; var resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); if (!resourceNames.Any()) return null; if (resource.Contains(',')) resource = resource.Substring(0, resource.IndexOf(',')); var assemblyFile = string.Format(".{0}.dll", resource); var resourceName = resourceNames.SingleOrDefault(s => s.EndsWith(assemblyFile)); if (string.IsNullOrWhiteSpace(resourceName)) { assemblyFile = assemblyFile.Remove(0, 1); resourceName = resourceNames.SingleOrDefault(s => s.EndsWith(assemblyFile)); } if (string.IsNullOrWhiteSpace(resourceName)) return null; using (var stream = assembly.GetManifestResourceStream(resourceName)) { var block = new byte[stream.Length]; stream.Read(block, 0, block.Length); return Assembly.Load(block); } }
Pavel Mayorov
- 58,537
Monk
- 4,478
-
2Не надо давать копипасту своего ответа на разные вопросы. Разные вопросы подразумевают разные ответы. Если ответ совсем одинаков - значит, вопросы надо объединять как дубликаты. – Pavel Mayorov Dec 28 '16 at 05:54
-
@PavelMayorov давать только ссылку - не является ответом. Вопрос - дублем в принципе не является, хотя не мне решать. Лучше бы я пометил вопрос дублем? – Monk Dec 28 '16 at 07:09
-
На самом деле, проблема в том вопросе, а не в этом. Тот вопрос - довольно плохого качества, не стоило на него отвечать вовсе... – Pavel Mayorov Dec 28 '16 at 07:24
-
@Monk выбирайте какой из ответов вам милее - тот или этот. И снесите один из них – Dec 28 '16 at 08:20
-
@PavelMayorov перелинковал дубликат на http://ru.stackoverflow.com/questions/468942/ – Dec 28 '16 at 08:20
2
Я использую Costura.Fody. Просто устанавливаешь через nuget и все dll внедряются в exe
RusArt
- 2,783