Самостоятельное развертывание ядра .NET в Visual Studio 2017 - разница между каталогом публикации и каталогом win-x64

У меня Visual Studio 2017 15.8.7 установлен в Windows 10 с .NET Core SDK v2.1.403. Я пытаюсь создать автономное развертывание для основного консольного приложения dotnet. Когда Visual Studio публикует приложение, он создает каталог публикации и каталог win-x64, и я не уверен, какой из них является правильным каталогом для развертывания моего консольного приложения.

Я слежу за документация по развертыванию основного приложения dotnet. Вот содержимое моего файла .pubxml:

<?xml version = "1.0" encoding = "utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion = "4.0" xmlns = "http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Debug</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <PublishDir>bin\Debug\netcoreapp2.1\publish\</PublishDir>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <SelfContained>true</SelfContained>
    <_IsPortable>false</_IsPortable>
  </PropertyGroup>
</Project>

В документации сказано, что вывод будет помещен в PublishDir, который я установил как bin\Debug\netcoreapp2.1\publish\. Когда я публикую приложение, я вижу два каталога в bin\Debug\netcoreapp2.1 - каталог публикации и каталог win-x64. В каталоге win-x64 гораздо меньше элементов, чем в каталоге публикации; только результаты моего проекта, файл .exe для моего приложения и следующие файлы: hostfxr.dll, hostpolicy.dll и <myappname>.deps.json. В каталоге публикации есть все эти файлы плюс еще много dll; вроде того, что я ожидал от автономного развертывания.

В чем разница между этими двумя каталогами?

В документации говорится:

Note that each target location (in the case of our example, bin\release\netcoreapp2.1\publish\ profile-name contains the complete set of files (both your app files and all .NET Core files) needed to launch your app.

У меня есть каталог публикации, настроенный в качестве целевого местоположения, так откуда берется win-x64? Есть ли у него минимум файлов, необходимых для запуска приложения или чего-то еще? Когда я пытаюсь запустить файл .exe в каталоге win-x64, кажется, что консольное приложение работает нормально. Я пытаюсь понять, нужно ли мне использовать содержимое каталога публикации или каталога win-x64. Я искал на сайте документации и на других сайтах в Интернете, но я не могу найти четкого объяснения того, почему создаются два выходных каталога. Есть заметная разница в размерах, поэтому, если мне удастся обойтись без win-x64, это будет здорово. Я просто не уверен, что это правильный каталог.

Обычно каталог x64 содержит только библиотеки DLL вашего проекта. Ваше приложение также встроено в DLL. Чтобы запустить его в целевой системе, вам нужно выполнить некоторую команду. Каталог публикации, в зависимости от параметров публикации, содержит все файлы, необходимые для работы, включая (не всегда) exe-файл, который можно легко запустить в целевой системе.

Mike Petrichenko 27.10.2018 08:38

Это то, что я подумал сначала, но в каталоге win-x64 есть файл .exe. Мне не нужно использовать dotnet MyApp.dll для запуска. Я могу запустить файл MyApp.exe напрямую. Это заставляет меня задуматься, является ли это также каталогом вывода.

greyseal96 27.10.2018 08:41

Это также зависит от ваших вариантов сборки и целевой платформы. В любом случае, публикация напрямую включает все файлы, необходимые для вашего приложения (включая NET Core). Например, для Win IoT Release папка не содержит исполняемых файлов, и вам необходимо изменить некоторые настройки в файле конфигурации, чтобы напрямую опубликовать exe. На самом деле, если ваша целевая платформа только на ПК с Windows, вы можете игнорировать каталог публикации.

Mike Petrichenko 27.10.2018 13:25

@ greyseal96 Привет, дружище. Какая у этого цель? Благодаря этому вы можете сохранить работоспособность ядра .n - сделать свой веб-API доступным, не публикуя его в IIS?

Roxy'Pro 21.04.2020 18:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 551
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы собираетесь развертывать автономный, вам необходимо использовать содержимое вашего каталога публикации. Папка win-x64 - это подмножество каталога публикации, содержащего файлы времени выполнения, отличные от .Net Core (в основном файлы, относящиеся только к вашему коду).

Смысл развертывания автономный состоит в том, чтобы управлять основной средой выполнения .net вашего приложения, а не полагаться на среду выполнения на целевой машине. Если вы выберете среду выполнения win-x64 и сделаете selfconolated = false, вы увидите, что исполняемый не создается.

Другие вопросы по теме