Отладка приложений .NET в WSL с помощью Visual Studio
Вы можете легко запускать и отлаживать приложения .NET Core и .NET 5+ в Linux, не выходя из Visual Studio с помощью WSL. Если вы разрабатываете кросс-платформенные приложения, этот метод предоставляет простой способ тестировать большинство целевых сред.
Для пользователей Windows .NET, разрабатывающих приложения для Linux, WSL 2 — это оптимальное сочетание реалистичной рабочей среды и высокой производительности. В Visual Studio вы уже можете выполнять отладку в удаленной среде Linux, используя удаленный отладчик или контейнеры с помощью соответствующих средств. Эти варианты подойдут, если больше всего необходимо достичь реалистичных условий. Когда более важен простой и быстрый внутренний цикл, WSL является отличным вариантом.
Не ограничивайтесь одним методом. У вас может быть профиль запуска для Docker и WSL в одном проекте, и вы можете выбрать тот, который подходит для конкретного типа запуска. После развертывания приложения всегда можно подключить удаленный отладчик в случае возникновения проблемы.
Начиная с Visual Studio 2019 версии 16.11 Preview 3, цель отладки WSL 2 была переименована в WSL.
Необходимые компоненты
- Visual Studio 2019 v16.9 Preview 1 или более поздние версии с отладкой .NET с дополнительным компонентом WSL. Чтобы проверить наличие компонента WSL, выберите Сервис>Получить средства и компоненты. В Visual Studio Installer убедитесь, что компонент установлен, выбрав вкладку Отдельные компоненты и введя WSL в поле поиска. В некоторых версиях Visual Studio дополнительный компонент включен по умолчанию с некоторыми рабочими нагрузками .NET.
- Установка WSL.
- Установленный дистрибутив по вашему усмотрению.
Запуск отладки с WSL

- После установки необходимых компонентов откройте веб-приложение ASP.NET Core или консольное приложение .NET Core в Visual Studio. Вы увидите новый профиль запуска с именем WSL:
- Выберите этот профиль, чтобы добавить его в файл launchSettings.json. В следующем примере показаны некоторые ключевые атрибуты в файле.
Примечание. Начиная с Visual Studio 2022 Preview 3, имя команды в профиле запуска изменилось с WSL2 на WSL.
"WSL": < "commandName": "WSL", "launchBrowser": true, "launchUrl": "https://localhost:5001", "environmentVariables": < "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000", "ASPNETCORE_ENVIRONMENT": "Development" >, "distributionName": "" >
"WSL": < "commandName": "WSL2", "launchBrowser": true, "launchUrl": "https://localhost:5001", "environmentVariables": < "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000", "ASPNETCORE_ENVIRONMENT": "Development" >, "distributionName": "" >
Протестированы и поддерживаются только Ubuntu и Debian. Другие дистрибутивы, поддерживаемые .NET, должны работать, но для этого требуется вручную установить среду выполнения .NET и cURL.
Выбор конкретного дистрибутива
По умолчанию профиль запуска WSL 2 использует стандартный дистрибутив, заданный в файле wsl.exe. Если нужно запустить профиль для другого конкретного дистрибутива, независимо от используемого по умолчанию, можно изменить профиль запуска. Например, если вы отлаживаете веб-приложение и хотите проверить его в Ubuntu 20.04, профиль запуска будет выглядеть следующим образом:
"WSL": < "commandName": "WSL", "launchBrowser": true, "launchUrl": "https://localhost:5001", "environmentVariables": < "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000", "ASPNETCORE_ENVIRONMENT": "Development" >, "distributionName": "Ubuntu-20.04" >
"WSL": < "commandName": "WSL2", "launchBrowser": true, "launchUrl": "https://localhost:5001", "environmentVariables": < "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000", "ASPNETCORE_ENVIRONMENT": "Development" >, "distributionName": "Ubuntu-20.04" >
Ориентация на несколько дистрибутивов
Если вы создаете приложение, предназначенное выполняться в нескольких дистрибутивах, и хотите быстро проверить работу в каждом из них, следующим шагом будет создание нескольких профилей запуска. Например, если необходимо проверить консольное приложение в Debian, Ubuntu 18.04 и Ubuntu 20.04, можно использовать следующие профили запуска:
"WSL : Debian": < "commandName": "WSL", "distributionName": "Debian" >, "WSL : Ubuntu 18.04": < "commandName": "WSL", "distributionName": "Ubuntu-18.04" >, "WSL : Ubuntu 20.04":
"WSL : Debian": < "commandName": "WSL2", "distributionName": "Debian" >, "WSL : Ubuntu 18.04": < "commandName": "WSL2", "distributionName": "Ubuntu-18.04" >, "WSL : Ubuntu 20.04":
Эти профили запуска обеспечивают легкое и удобное переключение между целевыми дистрибутивами, при этом не нужно выходить из Visual Studio.

Подключение к выполняемому процессу WSL
Помимо отладки при запуске приложения с помощью клавиши F5, можно выполнить отладку, подключившись к выполняемому процессу WSL с помощью функции подключения к процессу.

- После запуска приложения выберите Отладка>Подключить к процессу.
- В поле Тип подключения выберите Подсистема Windows для Linux (WSL), а затем в поле Цель подключения выберите дистрибутив Linux.
- Выберите Присоединиться.
Параметры WSL в профиле запуска
В следующей таблице приведены параметры, которые поддерживаются в профиле запуска.
| Имя. | По умолчанию | Характер использования | Поддержка маркеров |
|---|---|---|---|
| executablePath | dotnet | Путь к исполняемому файлу, который следует запустить. | Да |
| commandLineArgs | Значение свойства «TargetPath» MSBuild, сопоставленное со средой WSL. | Аргументы командной строки, переданные согласно параметру executablePath. | Да |
| WorkingDirectory | Для консольных приложений: OutDir> Для веб-приложений: ProjectDir> |
Рабочий каталог, в котором следует запустить отладку. | Да |
| environmentVariables | Пары «ключ — значение» переменных среды, которые необходимо установить для отлаживаемого процесса. | Да | |
| setupScriptPath | Скрипт, который следует запустить перед отладкой. Используется для выполнения таких скриптов, как ~/.bash_profile. | Да | |
| distributionName | Имя дистрибутива WSL, который следует использовать. | No | |
| launchBrowser | false | Указывает, следует ли запускать браузер. | No |
| launchUrl | URL-адрес, по которому следует перейти, если для параметра launchBrowser задано значение true. | No |
ProjectDir> — путь к каталогу проекта.
OutDir> — значение свойства OutDir MSBuild.
Все пути указываются для WSL, а не для Windows.
Передача аргумента командной строки
commandLineArgs Используйте параметр для передачи аргумента командной строки WSL в профиле запуска.
В следующем примере вы передаете два аргумента в проект DLL с именем ConsoleApp.
"WSL": < "commandName": "WSL", "commandLineArgs": "\"/ConsoleApp.dll\" arg1 arg2" >
Зарезервированные и стандартные свойства MSBuild
MSBuild предоставляет набор предопределенных свойств для сохранения информации о файле проекта и двоичных файлах MSBuild. Значения этих свойств вычисляются так же, как и значения других свойств MSBuild. Например, для использования свойства MSBuildProjectFile необходимо ввести $(MSBuildProjectFile)
Для определения зарезервированных и известных свойств в MSBuild используются значения, приведенные в следующей таблице. Зарезервированные свойства нельзя переопределить, и большинство известных свойств не следует переопределять, кроме расширенных сценариев.
Зарезервированные и стандартные свойства
В таблице в этом разделе показаны предопределенные свойства MSBuild. Пример столбца в таблице относится к следующему примеру файла проекта, который должен находиться C:\Source\Repos\ConsoleApp1\ConsoleApp1 по адресу, и показывает пример значений, которые эти свойства имеют при доступе к файлу проекта, когда MSBuild вызывается без специальных параметров командной строки.
Exe netcoreapp3.1
| Свойство | Зарезервированное или стандартное | Description | Пример |
|---|---|---|---|
| FrameworkSDKRoot | Стандартное | Путь к корневой папке для средств платформа .NET Framework. | C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\ |
| InnerBuildProperty | Стандартное | Указывает имя свойства, определяющее измерение многонацелевой сборки (применимо только в том случае, если текущая сборка является сборкой графа). | TargetFramework |
| InnerBuildPropertyValues | Стандартное | Указывает имя свойства, которое содержит возможные значения для ( InnerBuildProperty применимо, только если текущая сборка является сборкой графа). | TargetFrameworks |
| IsGraphBuild | Стандартное | True Значение , если это сборка графа; -graphBuild то есть параметр действует. Этот параметр означает, что MSBuild создает и создает граф проекта. Построение графа включает определение ссылок проекта для образования зависимостей. Построение этого графа включает попытку сборки ссылок проекта до проектов, ссылающихся на них, в отличие от традиционного графика MSBuild. | |
| MSBuildAssemblyVersion | Зарезервировано | Версия сборок MSBuild, используемая для сборки проекта. | 16,0 |
| MSBuildBinPath | Зарезервировано | Абсолютный путь к папке, где находятся используемые в данный момент двоичные файлы MSBuild (например, C:\Windows\Microsoft.Net\Framework\ ). Это свойство удобно, если вам нужно ссылаться на файлы в каталоге MSBuild. |
В .NET Framework 3.5 и более ранних версиях значение по умолчанию MSBuildExtensionsPath указывает на путь к вложенной папке MSBuild в папке Program Files\ или Program Files (x86) , в зависимости от разрядности текущего процесса. Например, для 32-разрядного процесса на 64-разрядном компьютере это свойство указывает папку на \Program Files (x86). Для 64-разрядного процесса на 64-разрядном компьютере это свойство указывает на папку \Program Files.
Не включайте в это свойство завершающую обратную косую черту.
Это расположение хорошо подходит для хранения пользовательских файлов целей. Например, файлы целей можно установить в папку \Program Files\MSBuild\MyFiles\Northwind.targets, а затем импортировать в файлы проекта с помощью следующего XML-кода:
— Когда для атрибута ContinueOnError элемента Task (MSBuild) задано значение WarnAndContinue (или true ) или ErrorAndContinue .
Чтобы выполнить сборку в любой точке дерева, введите следующее:
Не включайте в путь завершающую обратную косую черту.
Не включайте в путь завершающую обратную косую черту.
Не включайте в путь завершающую обратную косую черту.
| Свойство | Зарезервированное или стандартное | Description | Пример |
|---|---|---|---|
| FrameworkSDKRoot | Стандартное | Путь к корневой папке для средств платформа .NET Framework. | C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\ |
| InnerBuildProperty | Стандартное | Указывает имя свойства, определяющее измерение многонацелевой сборки (применимо только в том случае, если текущая сборка является сборкой графа). | TargetFramework |
| InnerBuildPropertyValues | Стандартное | Указывает имя свойства, которое содержит возможные значения для ( InnerBuildProperty применимо, только если текущая сборка является сборкой графа). | TargetFrameworks |
| IsGraphBuild | Стандартное | True Значение , если это сборка графа; -graphBuild то есть параметр действует. Этот параметр означает, что MSBuild создает и создает граф проекта. Построение графа включает определение ссылок проекта для образования зависимостей. Построение этого графа включает попытку сборки ссылок проекта до проектов, ссылающихся на них, в отличие от традиционного графика MSBuild. | |
| MSBuildAssemblyVersion | Зарезервировано | Версия сборок MSBuild, используемая для сборки проекта. | 17.0 |
| MSBuildBinPath | Зарезервировано | Абсолютный путь к папке, где находятся используемые в данный момент двоичные файлы MSBuild (например, C:\Windows\Microsoft.Net\Framework\ ). Это свойство удобно, если вам нужно ссылаться на файлы в каталоге MSBuild. |
В .NET Framework 3.5 и более ранних версиях значение по умолчанию MSBuildExtensionsPath указывает на путь к вложенной папке MSBuild в папке Program Files\ или Program Files (x86) , в зависимости от разрядности текущего процесса. Например, для 32-разрядного процесса на 64-разрядном компьютере это свойство указывает папку на \Program Files (x86). Для 64-разрядного процесса на 64-разрядном компьютере это свойство указывает на папку \Program Files.
Не включайте в это свойство завершающую обратную косую черту.
Это расположение хорошо подходит для хранения пользовательских файлов целей. Например, файлы целей можно установить в папку \Program Files\MSBuild\MyFiles\Northwind.targets, а затем импортировать в файлы проекта с помощью следующего XML-кода:
— Когда для атрибута ContinueOnError элемента Task (MSBuild) задано значение WarnAndContinue (или true ) или ErrorAndContinue .
Чтобы выполнить сборку в любой точке дерева, введите следующее:
Как запустить c# проект, если нет sln файла
Подскажите, пожалуйста, как запустить после клонирования программу из этого проекта — https://github.com/qubard/TwitchSpammer ?
Отслеживать
28.7k 22 22 золотых знака 61 61 серебряный знак 141 141 бронзовый знак
задан 28 окт 2020 в 18:11
11 4 4 бронзовых знака
Вот значит, кто мешает мне смотреть видео. Ну ну.. Viisual студия вполне открывает одиночный csproj и компилирует его. А так. ммммм. dotnet build asdf.csproj + dotnet run asdf.dll
28 окт 2020 в 18:13
Есть проект, а есть решение, это две разные совершенно вещи. Решение — это .sln (Solutions), он содержит в себе лишь информацию о том, какие проекты в нем есть, это по сути «группа проектов». Проект — это уже сама программа, вся ее информация, классы и так далее, у проекта есть «Файл проекта» (у c# это .csproj ), который отвечает за его открытие. Файл проекта содержит в себе информацию о версии языка, какие файлы и библиотеки этот проект содержит, ну и много разного. И тут я думаю вы уже поняли, что .sln не является основным файлом проекта, это лишь файл группы, созданный для удобства.
28 окт 2020 в 23:21
28 окт 2020 в 23:22
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В общем случае нужно сделать два шага:
- скомпилировать проект
- запустить проект
Допустим у меня есть простой проект ConsoleApp1.csproj (сделан по шаблону Visual studio 2019):
Exe netcoreapp3.1
И в нём (в этом каталоге) один файл Program.cs:
using System; namespace ConsoleApp1 < class Program < static void Main(string[] args) < Console.WriteLine("Hello World!"); >> >
Пишем в консоли dotnet build ConsoleApp1.csproj и получаем на выходе:
C:\temp\ConsoleApp1>dotnet build ConsoleApp1.csproj Microsoft (R) Build Engine версии 16.7.0+7fb82e5b2 для .NET (C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
Определение проектов для восстановления. Восстановлен C:\temp\ConsoleApp1\ConsoleApp1.csproj (за 151 ms). ConsoleApp1 -> C:\temp\ConsoleApp1\bin\Debug\netcoreapp3.1\ConsoleApp1.dll
Сборка успешно завершена. Предупреждений: 0 Ошибок: 0
Прошло времени 00:00:02.70
C:\temp\ConsoleApp1>
В итоге у нас появились папки bin и obj. Это был первый шаг.
Со вторым шагом всё просто. Переходим в папку C:\temp\ConsoleApp1\bin\Debug\netcoreapp3.1\ и запускаем там файл
C:\temp\ConsoleApp1\bin\Debug\netcoreapp3.1>ConsoleApp1.exe Hello World!
C:\temp\ConsoleApp1\bin\Debug\netcoreapp3.1>
Всё работает, как и ожидалось.
В некоторых проектах у вас не будет exe-файла, только dll. В этом случае необходимо запустить полученый на первом шаге dll-файл при помощи команды dotnet (Обычно, если dll файлов несколько то выбирайте с именем, совпадающим с именем проекта)
Альтернативно, можно объединить два шага в один, если сразу компилировать и запускать программу командой dotnet run filename.csproj . Например, удалив папки bin и obj дал такую команду:
C:\temp\ConsoleApp1>dotnet run ConsoleApp1.csproj
Hello World!
C:\temp\ConsoleApp1>
(Удобно, если вы уверены, что проект соберётся, скажем, запускаете не в первый раз)
Ну или можно просто скачать и поставить себе Visual Studio 2019 Community Edition и просто запустить проект через F5.
Проекту не известно, как запустить профиль ConsoleApp3 C# Visual Studio
Пытаюсь запустить начальную программу, при создании проекта и выдаёт такую ошибку «Проекту не известно, как запустить профиль ConsoleApp3». С чём связанно не знаю. В интернете нормальных решений не нашёл.
Вот сама программа: Console.WriteLine(«Hello, World!»);
Лучший ответ
Перезапусти
Остальные ответы
Фёдор ФилатовУченик (127) 1 год назад
Не помогает
Может скриншот скинешь
Фёдор ФилатовУченик (127) 1 год назад

L1mpУченик (129) 1 год назад

L1mpУченик (129) 1 год назад
И создавай консольное приложение

Фёдор Филатов Ученик (127) Валентин К, не в этом проблема, конечно.
L1mpУченик (129) 1 год назад
Запусти загрузочный фай визуал студио,и там выбери разработка классических приложений и поставь галочку возле пункта средства разработки для .net
L1mpУченик (129) 1 год назад