Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
.NET 9

Создать EXE с зависимостями (аналог публикации с опцией "Создать отдельный файл")

04.11.2025, 17:30. Показов 2297. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    private async void SaveExe()
    {
        if (compiledAssembly == null)
        {
            TextBoxOutput.Text = "Чтобы сохранить EXE, сначала выполните программу!";
            return;
        }
        var fileResult = await Dispatcher.UIThread.InvokeAsync(async () =>
            await TopLevel.GetTopLevel(this)?.StorageProvider.SaveFilePickerAsync(new()
            {
                Title = "Select the path to save an EXE file",
                DefaultExtension = ".exe",
                SuggestedFileName = "Program.exe",
            })!);
        var outputPath = fileResult?.TryGetLocalPath() ?? "";
        if (string.IsNullOrEmpty(outputPath))
            return;
        var outputDir = Path.GetDirectoryName(outputPath);
        var assembly = Assembly.GetExecutingAssembly();
        // Получаем все зависимости
        var dependencies = GetAllDependencies(assembly);
        // Копируем все зависимости
        foreach (var dep in dependencies)
        {
            var targetPath = Path.Combine(outputDir!, dep.GetName().Name + ".dll");
            File.Copy(dep.Location, targetPath, true);
        }
        // Копируем основную сборку
        File.Copy(assembly.Location, outputPath, true);
 
        // Создаем runtimeconfig.json
        CreateRuntimeConfig(outputPath);
        File.WriteAllBytes(outputPath, CompileProgram(TextBoxInput.Text)); //CompileProgram() возвращает собственно сборку (без зависимостей)
    }
 
    private List<Assembly> GetAllDependencies(Assembly assembly)
    {
        var dependencies = new List<Assembly>();
        var seen = new ListHashSet<string>();
 
        void AddDependencies(Assembly asm)
        {
            if (asm.FullName == null)
                return;
            if (seen.Contains(asm.FullName))
                return;
 
            seen.Add(asm.FullName);
            dependencies.Add(asm);
 
            foreach (var reference in asm.GetReferencedAssemblies())
            {
                try
                {
                    var refAssembly = Assembly.Load(reference);
                    AddDependencies(refAssembly);
                }
                catch { }
            }
        }
 
        AddDependencies(assembly);
        return dependencies;
    }
 
    private void CreateRuntimeConfig(string outputPath)
    {
        var config = $@"{{
    ""runtimeOptions"": {{
        ""tfm"": ""net{Environment.Version.Major}.{Environment.Version.Minor}"",
        ""frameworks"": [
            {{
                ""name"": ""Microsoft.NETCore.App"",
                ""version"": ""{Environment.Version.Major}.{Environment.Version.Minor}.{Environment.Version.Build}""
            }}
        ],
        ""configProperties"": {{
            ""System.Runtime.Loader.AssemblyLoadContext.DebuggingEnabled"": true
        }}
    }}
}}";
 
        var configPath = Path.GetFileNameWithoutExtension(outputPath) + ".runtimeconfig.json";
        File.WriteAllText(configPath, config);
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2025, 17:30
Ответы с готовыми решениями:

Не запускается EXE файл в папке для публикации в режиме "создать отдельный файл"
В .NET Core 3.1 работает, а в .NET 5 - нет. Ничего, кроме PDB, не убирал. От кода это не зависит,...

Combobox из базы данных с зависимостями
Подскажите пожалуйста как создать цепочку из выпадающих элементов (в первом выпадающем поле районы...

Получать из БД запись с ее зависимостями или без зависимостей?
Здравствуйте! К примеру есть класс class Company { public User User public Requisite...

27
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,738
13.11.2025, 05:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
В итоге решил, что приложение будет брать этот dotnet с собой.
У SDK есть лицензия. И не факт, что она позволяет распространять себя в составе другого продукта.

Лучше заверни свою штуку в инсталлятор, который будет уметь проверять наличие SDK в системе и скачивать и ставить это дело из сети. Это обычный подход в таких случаях.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
13.11.2025, 06:38
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это вам виднее, но раз вы решили "брать этот dotnet с собой", то я бы поступил бы по другому. Смотрим какие SDK установлены с помощью dotnet --list-sdks и используем самую старшую. Если ничего не нашли, то используем свою. Можно еще дать возможность пользователю выбрать версию.
Честно говоря впервые слышу про такой подход обычная практика если есть зависимость -- качаем/устанавливаем её (ну или тянем в качестве портабл либ). Учитывая что речь про SDK, а не runtime, ИМХО -- тут прям напрашивается требовать установку.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18346 / 14272 / 5370
Регистрация: 17.03.2014
Сообщений: 28,948
Записей в блоге: 1
13.11.2025, 08:21
Цитата Сообщение от Wolfdp Посмотреть сообщение
ИМХО -- тут прям напрашивается требовать установку.
Wolfdp, согласен. Я именно так сразу и предлагал. ТС, не ищет легких путей как обычно.
0
 Аватар для Andrey-MSK
3375 / 2261 / 388
Регистрация: 14.08.2018
Сообщений: 7,669
Записей в блоге: 4
13.11.2025, 08:35
Что-то я не совсем понял... А зачем SDK для запуска ПО? Достаточно ведь Runtime... И Usaga уже показал как упаковать Runtime в сборку.
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,738
13.11.2025, 08:49
Andrey-MSK, Коля ваяет свой язык поверх C#, с возможностью "генерации" исполняемых файлов. Он захотел поведения аналогичного dotnet publish --self-contained, но руками это реализовать не может. Вот от кого-то и прозвучал совет использовать сам dotnet из SDK. И тут встаёт другая проблема: либо требовать от пользователя установить это дело, либо тащить с собой, либо самому уметь ставить.

Костылина в любом случае.
1
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
13.11.2025, 15:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
У SDK есть лицензия. И не факт, что она позволяет распространять себя в составе другого продукта.
Позволяет (пункт 2):
a. Distributable Code.
The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.

i. Right to Use and Distribute. The code and test files listed below are “Distributable Code”.

REDIST.TXT Files. You may copy and distribute the object code form of code listed in REDIST.TXT files plus the files listed on the REDIST.TXT list. Depending on the specific edition of the software, the number of REDIST files you receive with the software may not be equal to the number of REDIST files listed in the REDIST.TXT List. We may add additional files to the list from time to time.
Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.
ii. Distribution Requirements. For any Distributable Code you distribute, you must

Add significant primary functionality to it in your programs;
For any Distributable Code having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your program;
Distribute Distributable Code included in a setup program only as part of that setup program without modification;
Require distributors and external end users to agree to terms that protect it at least as much as this agreement;
For Distributable Code from the Windows Performance Toolkit portions of the software, distribute the unmodified software package as a whole with your programs, with the exception of the KernelTraceControl.dll and the WindowsPerformanceRecorderControl.dll which can be distributed with your programs;
Display your valid copyright notice on your programs; and
Indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs.
iii. Distribution Restrictions. You may not

Alter any copyright, trademark or patent notice in the Distributable Code;
Use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft;
Distribute partial copies of the Windows Performance Toolkit portion of the software package with the exception of the KernelTraceControl.dll and the WindowsPerformanceRecorderControl.dll which can be distributed with your programs;
Distribute Distributable Code to run on a platform other than the Microsoft operating system platform;
Include Distributable Code in malicious, deceptive or unlawful programs; or
Modified or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. And Excluded License is on that requir3es, as a condition of use, modification or distribution, that
The code be disclosed or distributed in source code form; or
Others have the right to modify it.
Яндекс-перевод
a. Распространяемый код.
Программное обеспечение содержит код, который вам разрешено распространять в разрабатываемых вами программах, если вы соблюдаете приведенные ниже условия.

i. Право на использование и распространение. Код и тестовые файлы, перечисленные ниже, являются “Распространяемым кодом”.

REDIST.TXT Файлы. Вы можете копировать и распространять код в виде объектного кода, указанный в разделе REDIST.TXT файлы, а также файлы, перечисленные в списке REDIST.TXT. В зависимости от конкретной версии программного обеспечения количество файлов REDIST, которые вы получаете вместе с программным обеспечением, может отличаться от количества файлов REDIST, перечисленных в списке REDIST.Текстовый список. Мы можем время от времени добавлять в список дополнительные файлы.
Распространение осуществляется третьими лицами. Вы можете разрешить распространителям ваших программ копировать и распространять распространяемый код как часть этих программ.
ii. Требования к распространению. Для любого распространяемого кода, который вы распространяете, вы должны

Добавить к нему существенные основные функциональные возможности в своих программах;
Для любого распространяемого кода с расширением имени файла .lib распространяйте только результаты выполнения такого распространяемого кода с помощью компоновщика в вашей программе.;
Распространять распространяемый код, включенный в программу установки, только как часть этой программы установки без каких-либо изменений;
Требовать от распространителей и внешних конечных пользователей согласия с условиями, которые защищают его по крайней мере в той же степени, что и настоящее соглашение;
Что касается распространяемого кода из частей программного обеспечения Windows Performance Toolkit, распространяйте неизмененный пакет программного обеспечения в целом вместе с вашими программами, за исключением KernelTraceControl.dll и WindowsPerformanceRecorderControl.dll, которые могут распространяться вместе с вашими программами;
Разместите на своих программах действующее уведомление об авторских правах; и
Возмещать убытки, защищать и оградить корпорацию Майкрософт от любых претензий, включая оплату услуг адвокатов, связанных с распространением или использованием ваших программ.
iii. Ограничения на распространение. Вы не имеете права

Изменять любые уведомления об авторских правах, товарных знаках или патентах в распространяемом коде;
Используйте товарные знаки Microsoft в названиях своих программ или таким образом, чтобы это указывало на то, что ваши программы созданы Корпорацией Майкрософт или одобрены ею;
Распространяйте частичные копии программного пакета Windows Performance Toolkit, за исключением KernelTraceControl.dll и WindowsPerformanceRecorderControl.dll, которые могут распространяться вместе с вашими программами;
Распространяйте распространяемый код для запуска на платформе, отличной от платформы операционной системы Microsoft;
Включать распространяемый код во вредоносные, вводящие в заблуждение или незаконные программы; или
Изменять или распространять исходный код любого распространяемого кода таким образом, чтобы на любую его часть распространялась Исключенная лицензия. И Исключенная лицензия заключается в том, что в качестве условия использования, модификации или распространения требуется, чтобы
Код должен быть раскрыт или распространен в виде исходного кода; или
Другие лица имеют право изменять его.
Требование принять лицензионное соглашение добавил в инсталлятор.

Добавлено через 1 час 45 минут
OwenGlendower, я вот еще думаю: как быть с билдами? Тащить .NET SDK в каждый? Сейчас он вшит в <ProjectName>.dll внедренным ресурсом - так делать плохо? Лучше отдельным файлом, который можно исключить из билдов?

Добавлено через 18 минут
OwenGlendower, вот только отдельным файлом почему-то не работает. Жду ответа хоть в той, хоть в этой теме, как это починить.
0
 Аватар для Midian
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
13.11.2025, 16:01
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
я вот еще думаю: как быть с билдами? Тащить .NET SDK в каждый?
обычно для этого используют пререквизиты, которые зашивают в инсталлятор, любой пререквизит можно взять на сайте мягких под конкретный .NET
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,738
13.11.2025, 17:19
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Позволяет (пункт 2):
Это ты привёл ссылку на плюсовый SDK. Это не про .NET SDK.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2025, 17:19

Функция заданная разными зависимостями в разных диапазонах
Решить данную задачу на c# используя только цикл for.

Динамическая загрузка dll с зависимостями
Имею библиотеку классов и хочу её динамически подключать, если библиотека не имеет сторонних...

Изолированная загрузка dll с зависимостями
Всем привет. Тема заезженная, но с некоторыми переходами на .net core многая информация уже не...

При публикации теряется конфигурационный файл
В папке проекта я создал .ini файл, в котором хранится некоторая конфигурация приложения, которую...

Аналог проводника. При входе в папку открывать ее в отдельном окне
Есть простой проводник, нужно чтобы при входе в папку она открывалась в отдельном окне. И чтобы...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru