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

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

04.11.2025, 17:30. Показов 2779. Ответов 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
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
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
18409 / 14340 / 5371
Регистрация: 17.03.2014
Сообщений: 29,030
Записей в блоге: 1
13.11.2025, 08:21
Цитата Сообщение от Wolfdp Посмотреть сообщение
ИМХО -- тут прям напрашивается требовать установку.
Wolfdp, согласен. Я именно так сразу и предлагал. ТС, не ищет легких путей как обычно.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
13.11.2025, 08:35
Что-то я не совсем понял... А зачем SDK для запуска ПО? Достаточно ведь Runtime... И Usaga уже показал как упаковать Runtime в сборку.
0
Эксперт .NET
 Аватар для Usaga
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
13.11.2025, 08:49
Andrey-MSK, Коля ваяет свой язык поверх C#, с возможностью "генерации" исполняемых файлов. Он захотел поведения аналогичного dotnet publish --self-contained, но руками это реализовать не может. Вот от кого-то и прозвучал совет использовать сам dotnet из SDK. И тут встаёт другая проблема: либо требовать от пользователя установить это дело, либо тащить с собой, либо самому уметь ставить.

Костылина в любом случае.
1
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 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
610 / 392 / 198
Регистрация: 31.03.2013
Сообщений: 2,702
13.11.2025, 16:01
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
я вот еще думаю: как быть с билдами? Тащить .NET SDK в каждый?
обычно для этого используют пререквизиты, которые зашивают в инсталлятор, любой пререквизит можно взять на сайте мягких под конкретный .NET
0
Эксперт .NET
 Аватар для Usaga
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
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
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru