#.net #visual-studio #winforms #.net-5 #.net-6.0
Вопрос:
Я использую visual studio 2022 и создал приложение winforms .net 6. Я указал путь вывода для своей сборки выпуска, в котором я хочу создать файл .exe, но visual studio создает подпапку под названием «net6.0-windows» и помещает туда исполняемый файл. Как мне остановить это и заставить его поместить exe-файл туда, где я указал?
Некоторая предыстория: я обновляю Winforms .Net Framework 4.8 до .Net 6. В .net framework он помещает исполняемый файл в указанную выходную папку (без вложенных папок). Я хочу придерживаться того же поведения, потому что другие файлы и утилиты также должны быть там или искать в этой папке.
Путь вывода, указанный в visual studio
[]
Фактический выходной путь
[]
Комментарии:
1. Содержит ли ваш .csproj свойство <targetFramework> или <targetFramework><TargetFrameworks>? Он будет делать то, что вы видите, когда в одной сборке нацелено несколько фреймворков.
2. Это поведение по умолчанию и ожидаемое — Winforms работает только для Windows , поэтому вы действительно ориентируетесь
.net6-windows
, и, следовательно, вы получаете подпапку. Вы можете остановить это — вам нужно привыкнуть к этому и смириться с этим ….3. .NET 6-это .NET Core 6. По умолчанию используются папки, относящиеся к среде выполнения, вероятно, начиная с .NET Core 1.0. Приложение .NET Core может быть предназначено для разных сред выполнения, поэтому невозможно просто поместить все в
binRelease
4.
I want to keep with the same behavior
вы больше не используете .NET Framework, вы используете .NET Core. Инструменты ожидают, что файлы будут найдены в правильном месте.binRelease
даже не содержит опубликованных двоичных файлов, они находятся вpublish
папке. Если вы опубликуете исполняемый файл с одним файлом, папка сборки по-прежнему будет содержать отдельные файлы, в то времяpublish
как папка будет содержать один.exe
файл . Если вы хотите создать установщик, вам придется использовать файлы, относящиеся к среде выполнения, изpublish
папки, а не изbinRelease
папки
Ответ №1:
Я предоставлю следующую информацию для справки и для ответа на вопрос.
Вы можете предотвратить добавление targetFramework в выходную папку, добавив в файл проекта следующее свойство.
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
Кроме того, вы можете запретить добавление идентификатора времени выполнения (например win-x64
), если таковой имеется, установив для этого свойства значение false:
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
Стоит ли вам это делать?
Может быть, и нет. Эти каталоги существуют по определенной причине: чтобы разрешить параллельную работу с несколькими целевыми фреймами (версиями) и/или несколькими идентификаторами времени выполнения (в противном случае выходные данные будут смешиваться нечестивым образом).
Комментарии:
1. Есть ли необходимость в этом, если вы создаете приложение WinForms/WPF? Я понимаю необходимость в этом при создании библиотек, которые распространяются и используются многими различными типами среды выполнения, но как быть при создании настольного приложения?
2. Спасибо, Кристиан, первая строка, которую ты перечислил, сделала свое дело. Для тех, кому интересно, почему я этого хотел, это программное обеспечение предназначено для производственного оборудования и будет когда-либо установлено только на нескольких компьютерах, поэтому мы не используем публикацию, мы просто перемещаем папку сборки выпуска в специальное место на оборудовании, и она должна поддерживать правильную функциональность с другим программным обеспечением. Это также доставляет дополнительное удовольствие, связанное с правилами и документацией FDA.
3. Обратите внимание, что, как уже говорили другие, папка «Выпуск» (или «Отладка»), как правило, не включает все зависимости, необходимые для запуска приложения. Полная история, ну, сложная (для начала найдите «автономное приложение .net core»). В общем, только после выполнения шага «опубликовать» вы можете быть уверены, что у вас есть все зависимости, необходимые приложению для запуска в другом окне.