Перейти к основному содержимому

5.05. Справочник по конфигурациям в C#

Разработчику Архитектору

Справочник по конфигурациям в C#

1. .csproj — файл проекта (MSBuild)

Файл описывает компиляцию, ссылки, пакеты и свойства сборки. Является XML-документом, совместимым с MSBuild.

1.1. Корневой элемент и базовые атрибуты

<Project Sdk="Microsoft.NET.Sdk">
  • Sdk — указывает на SDK-проект (.NET SDK — Microsoft.NET.Sdk, веб — Microsoft.NET.Sdk.Web, для тестов — Microsoft.NET.Sdk.Test).
    • Допустимые значения:
      • Microsoft.NET.Sdk
      • Microsoft.NET.Sdk.Web
      • Microsoft.NET.Sdk.Worker
      • Microsoft.NET.Sdk.Razor
      • Microsoft.NET.Sdk.WindowsDesktop (WPF/WinForms)
      • Microsoft.NET.Sdk.BlazorWebAssembly
      • MSBuild.Sdk.Extras — для кроссплатформенных библиотек (Xamarin, UWP и т.п.)
    • Влияет на импортируемые props и targets.
    • Можно явно импортировать SDK через <Import Sdk="..." />, но это редко нужно.

1.2. <PropertyGroup> — свойства проекта

Основные свойства (часто объединяются по Condition или Label):

СвойствоТипОписаниеЗначение по умолчанию / примечания
TargetFrameworkстрокаЦелевая платформа (одна). Для нескольких — TargetFrameworks.Например: net8.0, net7.0-windows, net6.0-android34.0. Формат: net[версия][-ОС[-версия]].
TargetFrameworksстрокаСписок через ;. Например: net6.0;net7.0;net8.0.При его наличии TargetFramework игнорируется.
OutputTypeстрокаТип выходного файла.Library, Exe, WinExe, Module, AppContainerExe, WinMdObj.
AssemblyNameстрокаИмя сборки (без расширения .dll/.exe).По умолчанию — имя проекта.
RootNamespaceстрокаКорневое пространство имён.По умолчанию — AssemblyName.
LangVersionстрокаВерсия языка C#.latest, preview, default, или явно: 10.0, 11.0, 12.0.
NullableстрокаВключение Nullable Reference Types.enable, disable, annotations, warnings.
ImplicitUsingsстрокаАвто-добавление global using из SDK.enable, disable.
NullableContextOptionsстрока[Устаревшее] — заменено Nullable.
GenerateDocumentationFileboolСоздание XML-документации.false. При true генерируется <AssemblyName>.xml.
DocumentationFileпутьЯвный путь к XML-файлу документации.Автоматически <OutputPath><AssemblyName>.xml, если не задано.
NoWarn, WarningsAsErrors, TreatWarningsAsErrorsсписок / boolУправление предупреждениями.NoWarn — через ;, например: CS1591;NU1701. TreatWarningsAsErrors приоритетнее WarningsAsErrors.
DebugTypeстрокаФормат отладочной информации.portable (по умолчанию), full, pdbonly, embedded, none.
DebugSymbolsboolГенерировать ли .pdb.true в Debug, false в Release, если не переопределено.
DeterministicboolДетерминированная сборка (стабильный MVID).true по умолчанию в SDK-проектах.
ContinuousIntegrationBuildboolПризнак CI-сборки (влияет на SourceLink, EmbedAllSources).Обычно true в CI.
EmbedAllSourcesboolВстраивать исходники в .pdb.Требует DebugType=embedded или portable + SourceLink.
PublishReadyToRunboolAOT-компиляция (R2R).Требует указания RuntimeIdentifier.
PublishSingleFileboolУпаковка в один исполняемый файл.Может конфликтовать с SelfContained=false.
SelfContainedboolВключать ли runtime в публикацию.По умолчанию true, если указан RuntimeIdentifier.
RuntimeIdentifier, RuntimeIdentifiersстрока / списокЦелевые RID (например, win-x64, linux-arm64).При RuntimeIdentifiers — мультиплатформенная публикация.
PlatformTargetстрокаЦелевая архитектура.AnyCPU (по умолчанию), x86, x64, arm64, Itanium. Влияет на JIT, но не на RID.
IsPackableboolВключать ли проект в dotnet pack.true, если есть PackageId или PackageVersion.
PackageId, PackageVersion, Authors, Description, PackageLicenseExpression, PackageProjectUrl, RepositoryUrl, RepositoryType, PackageTagsстрокаМетаданные NuGet-пакета.Обязательны только PackageId и PackageVersion для pack.
AnalysisLevelстрокаУровень анализа кода (CAxxx).latest, 5, 5.0, 6.0, 7.0, 8.0, preview. Или none.
EnforceCodeStyleInBuildboolПрименять правила из .editorconfig на уровне ошибок.false по умолчанию. Требует <AnalysisMode> или <CodeAnalysisTreatWarningsAsErrors>.
AnalysisModeстрокаНабор правил анализа.all, recommended, minimum, none. Можно уточнить: AnalysisLevel + AnalysisMode.
EnableNETAnalyzersboolВключить встроенные анализаторы .NET.true по умолчанию, начиная с .NET 5.
RestorePackagesWithLockFileboolИспользовать packages.lock.json.false. При true — фиксация версий зависимостей.
CopyLocalLockFileAssembliesboolКопировать зависимости в выходную папку (даже если не SelfContained).false — только при dotnet publish. Полезно для отладки локальных зависимостей.

Пример:

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12.0</LangVersion>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<AnalysisLevel>8.0-recommended</AnalysisLevel>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>

1.3. <ItemGroup> — элементы проекта

1.3.1. <PackageReference>

<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

Доп. атрибуты:

  • Version: строка, семвер (может включать *, например 13.0.* — но не рекомендуется).
  • PrivateAssets: all, runtime, compile, contentfiles, analyzers, build, none. Определяет, что не передаётся по транзитивности.
  • ExcludeAssets: аналогично, но исключает из текущего проекта.
  • GeneratePathProperty: true — создаёт MSBuild-свойство PkgNewtonsoft_Json, указывающее на папку пакета.
  • IncludeAssets: ограничивает, какие части пакета использовать.

1.3.2. <ProjectReference>

<ProjectReference Include="..\Shared\Shared.csproj" />

Доп. атрибуты:

  • Private: true/false — влияет на PrivateAssets при упаковке NuGet.
  • SkipGetTargetFrameworkProperties: true — отключает проверку совместимости TargetFramework.
  • GlobalPropertiesToRemove: список свойств, удаляемых при построении зависимого проекта (через ;).

1.3.3. <Reference> — ссылка на сборку (устаревшее, но допустимо)

<Reference Include="System.Data" />
<Reference Include="MyAssembly">
<HintPath>..\lib\MyAssembly.dll</HintPath>
</Reference>
  • HintPath — путь к .dll.
  • SpecificVersiontrue/false.
  • Private — копировать ли в выходную папку.

1.3.4. <Compile>, <EmbeddedResource>, <None>, <Content>

  • Update, Remove, Include — для тонкой настройки элементов.
  • Атрибуты:
    • DependentUpon — для вложенности в IDE (.Designer.cs.cs).
    • Link — виртуальный путь в Solution Explorer.
    • CopyToOutputDirectory: Never, Always, PreserveNewest.
    • Visible: true/false — отображать в IDE.
    • ExcludeFromSingleFile: true — исключить из PublishSingleFile.

1.3.5. <FrameworkReference> — ссылка на метапакет фреймворка

<FrameworkReference Include="Microsoft.AspNetCore.App" />

Требуется для Microsoft.NET.Sdk.Web, но может быть явно указано.


2. Directory.Build.props и Directory.Build.targets

Файлы для наследуемых настроек на уровне каталога.

  • Обрабатываются рекурсивно: от корня к проекту.
  • Directory.Build.props импортируется до содержимого .csproj.
  • Directory.Build.targetsпосле.

Пример Directory.Build.props:

<Project>
<PropertyGroup>
<LangVersion>12.0</LangVersion>
<Nullable>enable</Nullable>
<AnalysisLevel>8.0-all</AnalysisLevel>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0" PrivateAssets="all" />
</ItemGroup>
</Project>

⚠️ Важно: файлы не наследуются через символические ссылки и не работают при сборке из другого корневого каталога (например, dotnet build /p:ProjectDir=...).


3. global.json

Управляет версией SDK и поведением восстановления пакетов.

{
"sdk": {
"version": "8.0.100",
"rollForward": "latestPatch",
"allowPrerelease": false
},
"msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.44"
},
"tools": {
"dotnet": "8.0.100"
}
}
КлючТипОписаниеДопустимые значения
sdk.versionстрокаТребуемая версия .NET SDK.Семвер (например, 7.0.403, 8.0.100).
sdk.rollForwardстрокаСтратегия "перекатывания" при отсутствии точной версии.disable, latestPatch, minor, latestMinor, major, latestMajor. По умолчанию — latestPatch.
sdk.allowPrereleaseboolРазрешить предварительные версии SDK.true/false.
msbuild-sdksобъектФиксация версий внешних MSBuild SDK (например, MSBuild.Sdk.Extras).Ключ — имя SDK, значение — версия.
tools.dotnetстрока(Устаревшее) — дублирует sdk.version.

Файл ищется вверх по дереву каталогов от проекта.


4. launchSettings.json — настройки запуска (отладка и CLI)

Располагается в Properties/launchSettings.json. Используется только в среде разработки: Visual Studio, VS Code, dotnet run. Не включается в сборку (dotnet publish игнорирует его).

Формат — JSON. Содержит профили (profiles), переменные окружения и параметры запуска.

4.1. Корневые секции

{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": { ... },
"profiles": { ... }
}

iisSettings — конфигурация IIS Express (только для .Web SDK)

ПараметрТипОписаниеПримечания
windowsAuthenticationboolВключить Windows Auth.По умолчанию false.
anonymousAuthenticationboolВключить анонимную аутентификацию.По умолчанию true.
iisExpressapplicationUrlстрокаURL для IIS Express (например, "http://localhost:5000").Можно несколько через ;.
iisExpresssslPortintПорт для HTTPS (например, 44300).Автоматически генерирует сертификат localhost.
iisapplicationUrl, sslPortАналогично, но для локального IIS (редко используется).

profiles — набор сред запуска

Ключ — имя профиля (например, "IIS Express", "MyApp"). Каждый профиль — объект со следующими полями:

ПараметрТипОписаниеДопустимые значения / примечания
commandNameстрокаКоманда запуска."Project" (запуск через dotnet run), "IISExpress", "Executable" (произвольный exe), "WSL2" (для Linux в WSL), "Docker" (требует расширение).
launchBrowserboolОткрыть браузер после запуска.Применяется только при commandName: "Project" или "IISExpress".
applicationUrlстрокаURL, передаваемый в --urls при dotnet run.Переопределяет ASPNETCORE_URLS. Пример: "https://localhost:7001;http://localhost:5001".
environmentVariablesобъектПеременные окружения.Ключ — имя (ASPNETCORE_ENVIRONMENT, DOTNET_ENVIRONMENT), значение — строка. Например: "ASPNETCORE_ENVIRONMENT": "Development".
dotnetRunMessagesboolВыводить ли служебные сообщения dotnet run.true/false.
executablePathстрокаПуть к исполняемому файлу (при commandName: "Executable").
commandLineArgsстрокаАргументы командной строки для executablePath.
workingDirectoryстрокаРабочая директория при запуске.По умолчанию — корень проекта.
nativeDebuggingboolВключить отладку неуправляемого кода.Требует настройки отладчика.
sqlDebuggingboolОтладка SQL (только в VS Enterprise).
remoteDebugEnabledboolУдалённая отладка (clrdbg на удалённой машине).
dockerRunCommandстрокаКоманда docker run (при commandName: "Docker").Устаревшее; предпочтительно использовать Dockerfile.
Пример профиля:
"profiles": {
"MyApp": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:7200;http://localhost:5200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"MyCustomSetting": "DebugMode"
}
},
"ConsoleApp": {
"commandName": "Project",
"commandLineArgs": "--mode test --verbose",
"workingDirectory": "./bin/Debug/net8.0"
}
}

⚠️ Нюансы:

  • Изменения в launchSettings.json вступают в силу без пересборки, но могут потребовать перезапуска отладчика.
  • Переменные из environmentVariables переопределяют системные.
  • ASPNETCORE_ENVIRONMENT влияет на загрузку appsettings.{Environment}.json.

5. appsettings.json и окружения

Файл конфигурации приложения времени выполнения. Поддерживается через Microsoft.Extensions.Configuration.

5.1. Формат и загрузка

По умолчанию:

  1. appsettings.json
  2. appsettings.{Environment}.json (например, appsettings.Development.json)
  3. Переменные окружения
  4. Аргументы командной строки

Порядок — переопределение: последующие источники перекрывают предыдущие.

5.2. Поддерживаемые типы значений

  • string, bool, int, long, double, decimal
  • Объекты (вложенные section)
  • Массивы (через [0], [1] или объекты)
Пример:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": [ "example.com", "localhost" ],
"FeatureFlags": {
"EnableBeta": true,
"MaxRetries": 5
},
"ConnectionStrings": {
"Default": "Server=.;Database=MyDb;Trusted_Connection=true;"
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"Https": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "localhost.pfx",
"Password": "dev"
}
}
}
}
}

5.3. Специальные секции (интерпретируются фреймворком)

СекцияОписаниеПримечания
LoggingНастройки логгера.Поддерживает LogLevel, Console, Debug, EventLog, ApplicationInsights.
AllowedHostsСписок разрешённых хостов для HostFiltering."*" — разрешить все. Обязательно для безопасности в production.
ConnectionStringsСтроки подключения.Доступ через Configuration.GetConnectionString("name").
KestrelКонфигурация Kestrel.Поддерживает Endpoints, Limits, Certificates.
Serilog / NLog / log4netПри наличии соответствующих провайдеров.Не встроены, но широко используются.
Azure / AWS / GoogleСекции для облачных SDK.Например, Azure:ServiceBus:ConnectionString.

5.4. Переменные окружения как источник

  • Иерархия заменяется на __ (два подчёркивания):
    Logging__LogLevel__Default=Debug
  • Имена — case-insensitive в Windows, case-sensitive в Linux.
  • ASPNETCORE_ и DOTNET_ префиксы имеют приоритет (например, ASPNETCORE_URLS переопределяет applicationUrl из launchSettings).

6. runtimeconfig.json — конфигурация среды выполнения

Генерируется при сборке (dotnet build) и публикации (dotnet publish). Располагается рядом с .dll: <AssemblyName>.runtimeconfig.json.

Содержит параметры для dotnet <app>.dll.

6.1. Структура

{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.GC.Server": true,
"System.Threading.ThreadPool.MinThreads": 50,
"System.Globalization.Invariant": false,
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}

runtimeOptions → ключи

КлючТипОписаниеДопустимые значения / примечания
tfmстрокаЦелевой фреймворк.Влияет на загрузку метаданных.
frameworkобъектОсновной фреймворк (для framework-dependent apps).name: Microsoft.NETCore.App, Microsoft.AspNetCore.App, Microsoft.WindowsDesktop.App. version: минимальная требуемая версия.
frameworksмассивМножественные фреймворки (редко).Например, для приложений с Microsoft.NETCore.App + Microsoft.AspNetCore.App.
rollForwardстрокаСтратегия обновления runtime.LatestPatch, Minor, LatestMinor, Major, LatestMajor, Disable. По умолчанию — Minor.
applyPatchesboolПрименять ли патчи (даже при rollForward: "Disable").Устаревшее.
configPropertiesобъектПараметры CLR и BCL.См. ниже.

configProperties — ключевые настройки CLR

КлючТипОписаниеПо умолчанию
System.GC.ServerboolСерверный GC.true для ASP.NET, false для консольных приложений.
System.GC.ConcurrentboolПараллельная сборка мусора.true.
System.GC.RetainVMboolУдерживать память после GC (не возвращать ОС).false.
System.Threading.ThreadPool.MinThreadsintМин. число потоков в пуле.Зависит от ядер.
System.Threading.ThreadPool.MaxThreadsintМакс. число потоков.Очень большое (≈32767).
System.Globalization.InvariantboolОтключить локализацию (меньше памяти, быстрее).false.
System.Reflection.Metadata.MetadataUpdater.IsSupportedboolРазрешить hot reload.true в Debug, false в Release.
System.Runtime.Loader.DefaultContext.TrustedPlatformAssembliesстрокаЯвный список .dll (для изолированных загрузчиков).Редко используется.
Microsoft.NET.HostModel.AppHost.OptimizeAppHostboolОптимизировать apphost (self-contained).true.

⚠️ Эти параметры можно задавать:

  • через runtimeconfig.template.json (в проекте: <RuntimeHostConfigurationOption>),
  • через переменные окружения (префикс DOTNET_),
  • через аргументы dotnet (например, --runtimeconfig).
Пример runtimeconfig.template.json:
{
"configProperties": {
"System.GC.Server": true,
"System.Globalization.Invariant": true
}
}

В .csproj:

<PropertyGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
</PropertyGroup>

7. deps.json — зависимости приложения

Генерируется при сборке (<AssemblyName>.deps.json). Содержит:

  • список всех зависимостей (включая транзитивные),
  • пути к сборкам,
  • хэши,
  • runtime и compile-временные зависимости,
  • native-библиотеки (.so, .dylib, .dll).

7.1. Структура (упрощённо)

{
"runtimeTarget": { "name": ".NETCoreApp,Version=v8.0", ... },
"targets": {
".NETCoreApp,Version=v8.0": {
"MyApp/1.0.0": { "runtime": { "MyApp.dll": { } } },
"Newtonsoft.Json/13.0.3": {
"runtime": { "lib/netstandard2.0/Newtonsoft.Json.dll": { } },
"compile": { "ref/netstandard2.0/Newtonsoft.Json.dll": { } }
}
}
},
"libraries": { ... }
}

7.2. Ключевые секции

СекцияОписание
runtimeTargetЦелевая платформа и RID (если self-contained).
targetsГруппировка зависимостей по TFM/RID.
librariesМетаданные о каждой библиотеке: хэш, тип (project, package, reference), пути.
runtimesNative-зависимости по RID (например, win-x64/native/sqlite3.dll).

⚠️ Этот файл обязателен для dotnet exec и запуска framework-dependent приложений. При его отсутствии — ошибка:

Error: assembly specified in the dependencies manifest was not found...

Изменять вручную не рекомендуется — используется только для диагностики и tooling (например, dotnet store).


8. packages.lock.json — фиксация версий зависимостей

Файл генерируется при первом восстановлении (dotnet restore), если в .csproj указано:

<PropertyGroup>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>

Цель — детерминированное восстановление: одинаковые версии пакетов на всех машинах и в CI.

8.1. Структура

{
"version": 1,
"dependencies": {
"net8.0": {
"Newtonsoft.Json/13.0.3": {
"type": "Direct",
"dependencies": {
"Microsoft.CSharp": "4.7.0",
"System.ComponentModel.TypeConverter": "4.3.0"
}
}
}
}
}
ПолеОписание
versionВерсия формата (на данный момент только 1).
dependenciesОбъект: ключ — TFM (например, net8.0, net7.0-windows), значение — дерево зависимостей.
typeDirect — прямая зависимость, Transitive — транзитивная.
dependencies (внутри пакета)Точный список дочерних пакетов и их версий.

8.2. Поведение

  • При dotnet restore:
    • Если packages.lock.json есть, NuGet строго следует ему (даже если в .csproj указана 13.*).
    • Если packages.lock.json отсутствует, он создаётся.
  • Чтобы обновить — удалите файл и выполните dotnet restore, или используйте:
    dotnet restore --force-evaluate
  • Для CI рекомендуется коммитить packages.lock.json.

⚠️ Ограничения:

  • Не поддерживает динамические версии (*, latest).
  • Не влияет на PackageReference с Version="..." в .csproj — версии в .csproj и .lock должны совпадать.
  • Может конфликтовать с CentralPackageVersionManagement (CPVM).

9. nuget.config — глобальные и локальные настройки NuGet

Файл может располагаться:

  • в корне решения (рекомендуется),
  • в ~/.nuget/NuGet/NuGet.Config (глобальный),
  • в %AppData%\NuGet\NuGet.Config (Windows),
  • в $XDG_CONFIG_HOME/NuGet/NuGet.Config или ~/.config/NuGet/NuGet.Config (Linux/macOS).

Формат — XML.

9.1. Основные секции

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="./packages" />
<add key="http_proxy" value="http://proxy.corp.com:8080" />
<add key="no_proxy" value="localhost,127.0.0.1" />
</config>

<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="internal" value="https://nuget.corp.com/v3/index.json" />
</packageSources>

<packageSourceCredentials>
<internal>
<add key="Username" value="user" />
<add key="ClearTextPassword" value="pass" />
</internal>
</packageSourceCredentials>

<activePackageSource>
<add key="All" value="(Aggregate source)" />
</activePackageSource>

<disabledPackageSources>
<add key="legacy" value="true" />
</disabledPackageSources>
</configuration>

9.2. Ключевые параметры

В <config>

КлючОписаниеПримечания
repositoryPathКаталог для packages.config (устаревшее).Не влияет на PackageReference.
globalPackagesFolderГлобальный кэш пакетов (~/.nuget/packages).Можно переопределить через NUGET_PACKAGES.
http_proxy, https_proxyПрокси для скачивания пакетов.Поддерживает аутентификацию через user:pass@host:port.
no_proxyСписок хостов без прокси (через ,).Может включать домены и CIDR-блоки.
defaultPushSourceИсточник по умолчанию для nuget push.
dependencyVersionСтратегия выбора версий при восстановлении.Lowest, HighestPatch, HighestMinor, Highest. По умолчанию — Lowest.

В <packageSources>

  • <clear /> — сброс настроек из родительских конфигов.
  • Порядок источников важен: первое совпадение побеждает.
  • Можно использовать локальные источники: value="C:\local-packages".

В <packageSourceCredentials>

  • Поддерживает ClearTextPassword, Password (зашифрован), ValidAuthenticationTypes.
  • Для Azure Artifacts рекомендуется использовать AzureDevOpsCredentialProvider.

Прочие секции

СекцияНазначение
<solution><add key="disableSourceControlIntegration" value="true" /> — отключить .nuget в TFS.
<bindingRedirects>Автогенерация app.config-перенаправлений (для legacy).

10. packages.config — устаревшая модель управления пакетами

Использовалась до .NET Core. Хранит все зависимости в одном XML-файле.

10.1. Структура

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net48" />
<package id="Microsoft.AspNet.Mvc" version="5.2.9" targetFramework="net48" />
</packages>
АтрибутОписание
idИмя пакета.
versionТочная версия.
targetFrameworkЦелевой фреймворк (например, net48, net461).
allowedVersionsОграничение обновлений (например, [13.0,14.0)).

10.2. Недостатки (почему устарела)

  • Нет транзитивных зависимостей — все зависимости дублируются.
  • Нет централизованного управления версиями.
  • Зависимости копируются в packages/, увеличивая размер репозитория.
  • Не поддерживает dotnet CLI (только nuget.exe и msbuild legacy).
  • Не совместима с PackageReference.

Конвертация:

nuget.exe update MyProject.csproj -self
# или через Visual Studio: "Migrate packages.config to PackageReference"

11. project.assets.json — промежуточный файл восстановления

Генерируется в obj/project.assets.json при dotnet restore. Используется MSBuild и dotnet build для:

  • разрешения зависимостей,
  • формирования deps.json,
  • копирования сборок в выходную папку.

11.1. Структура (сокращённо)

{
"version": 3,
"targets": { ... },
"libraries": { ... },
"projectFileDependencyGroups": {
"net8.0": [ "Newtonsoft.Json >= 13.0.3" ]
},
"packageFolders": {
"C:\\Users\\user\\.nuget\\packages\\": {}
}
}
СекцияОписание
targetsЗависимости по TFM/RID. Аналог deps.json, но до упаковки.
librariesМетаданные пакетов: тип, хэш, версия, зависимости.
projectFileDependencyGroupsГруппировка по TFM: какие PackageReference были в .csproj.
packageFoldersКаталоги с пакетами (глобальный кэш, fallback folders).

⚠️ Этот файл не коммитится.gitignore по умолчанию).
Если повреждён — удалите obj/ и выполните dotnet restore.


12. .nuspec — манифест NuGet-пакета

Файл XML, описывающий пакет. Может генерироваться автоматически из .csproj, либо создаваться вручную.

12.1. Структура (минимальная)

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>MyLibrary</id>
<version>1.0.0</version>
<authors>Timur Tagirov</authors>
<description>A useful .NET library</description>
<license type="expression">MIT</license>
<projectUrl>https://github.com/user/mylib</projectUrl>
<repository type="git" url="https://github.com/user/mylib" />
<dependencies>
<group targetFramework="net8.0">
<dependency id="Newtonsoft.Json" version="13.0.3" />
</group>
</dependencies>
</metadata>
<files>
<file src="bin/Release/net8.0/MyLibrary.dll" target="lib/net8.0/" />
<file src="README.md" target="" />
</files>
</package>

12.2. Элементы <metadata>

ЭлементОбязательныйОписаниеЗаметки
idУникальное имя пакета.Должно совпадать с PackageId.
versionВерсия пакета (семвер).Может содержать метки: 1.0.0-alpha.
authorsАвторы.Разделитель — ,.
descriptionОписание (до 4000 символов).Поддерживает Markdown в некоторых клиентах.
license✅ (или licenseUrl)Лицензия.Предпочтительно type="expression" (SPDX: MIT, Apache-2.0).
projectUrlСсылка на проект.Отображается в NuGet.org.
iconПуть к иконке в пакете (например, icon.png).Должен быть в <files>.
readmereadme.md в корне пакета.Отображается на NuGet.org.
repositoryТип и URL репозитория.Поддерживает git, svn, hg.
tagsКлючевые слова (через пробел).Улучшает поиск.
releaseNotesИзменения в версии.Поддерживает Markdown.
copyrightУведомление об авторских правах.Например: © 2025 Timur Tagirov.

12.3. <files> — содержимое пакета

  • target — папка в распакованном пакете:
    • lib/{tfm}/ — сборки времени выполнения,
    • ref/{tfm}/ — reference-сборки (для компиляции),
    • runtimes/{rid}/native/ — native-библиотеки,
    • content/ — файлы, копируемые в проект (устаревшее),
    • build/.targets/.props для MSBuild,
    • analyzers/dotnet/cs/ — анализаторы.
Пример структуры пакета:
MyLib.1.0.0.nupkg
├── lib/
│ └── net8.0/
│ └── MyLib.dll
├── ref/
│ └── net8.0/
│ └── MyLib.dll
├── build/
│ └── MyLib.targets
├── icon.png
├── README.md
└── MyLib.nuspec

13. Дополнительные параметры в .csproj для публикации и упаковки

13.1. dotnet publish — параметры публикации

СвойствоОписаниеПример
PublishDirЦелевая папка./p:PublishDir=./out
PublishReadyToRunAOT-компиляция (R2R).true
PublishSingleFileОдин файл.true
IncludeNativeLibrariesForSelfExtractВключить native-библиотеки в single-file.true (по умолчанию при PublishSingleFile=true)
SelfContainedВключить runtime.true/false
RuntimeIdentifierЦелевой RID.win-x64, linux-arm64
PublishTrimmedОбрезка неиспользуемого кода (linking).true (осторожно: может сломать reflection)
TrimModecopyused, link.
SuppressTrimAnalysisWarningsПодавить предупреждения обрезки.true
DebugTypeТип отладки в publish.embedded — встроить .pdb в .dll
ContinuousIntegrationBuildВключить SourceLink и детерминированность.true

13.2. dotnet pack — параметры упаковки

СвойствоОписание
IsPackableВключать ли в pack.
PackageOutputPathКуда класть .nupkg.
IncludeSymbolsГенерировать .snupkg.
SymbolPackageFormatsnupkg, symbols.nupkg.
EmbedUntrackedSourcesВстраивать исходники без истории git.
EmbedAllSourcesВстраивать все исходники.
AllowedOutputExtensionsInPackageBuildOutputFolderКакие расширения включать в build/. Например: .dll;.pdb;.xml.

14. app.config / web.config — конфигурация .NET Framework

Файл app.config переименовывается в <AssemblyName>.exe.config при сборке. Для ASP.NET — web.config.

14.1. Корневая структура

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- объявление секций -->
</configSections>

<!-- системные секции -->
<startup>...</startup>
<runtime>...</runtime>
<system.web>...</system.web>
<system.serviceModel>...</system.serviceModel>
<system.data>...</system.data>

<!-- пользовательские секции -->
<appSettings>...</appSettings>
<userSettings>...</userSettings>
<connectionStrings>...</connectionStrings>

<!-- кастомные секции -->
<mySection type="MyNamespace.MySectionHandler, MyAssembly">...</mySection>
</configuration>

14.2. <configSections> — объявление секций

Обязательно первым дочерним элементом <configuration>.

Элемент <section>

<section 
name="mySection"
type="System.Configuration.NameValueSectionHandler"
allowLocation="true"
requirePermission="false" />
АтрибутОписание
nameИмя секции в конфигурации.
typeПолное имя класса + сборка (или встроенного обработчика).
allowLocationМожно ли использовать <location> вокруг секции.
requirePermissionТребуются ли права администратора для чтения.

Встроенные обработчики секций

ТипОписаниеФормат секции
System.Configuration.AppSettingsSectionДля <appSettings><add key="K" value="V" />
System.Configuration.NameValueSectionHandlerПростой key-value<add key="K" value="V" />
System.Configuration.DictionarySectionHandlerТо же, но возвращает IDictionary<add key="K" value="V" />
System.Configuration.SingleTagSectionHandlerОдин тег с атрибутами<my attr1="v1" attr2="v2" />
System.Configuration.IgnoreSectionHandlerИгнорировать секциюЛюбое содержимое

<sectionGroup> — группировка секций

<sectionGroup name="applicationSettings" 
type="System.Configuration.ApplicationSettingsGroup, System">
<section name="MyApp.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System" />
</sectionGroup>

14.3. Системные секции

<startup>

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
Элемент/атрибутОписание
useLegacyV2RuntimeActivationPolicyРазрешить загрузку смешанных сборок (mixed-mode) под CLR 4.
supportedRuntimeversionv2.0.50727, v4.0.30319.
supportedRuntimesku.NETFramework,Version=v4.8, .NETCoreApp,Version=v3.1 (редко).

<runtime>

Контролирует поведение CLR.

<assemblyBinding>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
<codeBase version="13.0.0.0" href="lib/Newtonsoft.Json.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
ЭлементОписание
assemblyIdentityУникальный идентификатор сборки (имя + publicKeyToken).
bindingRedirectПеренаправление версий. Формат: A-BC.
codeBaseЯвный путь к .dll (для сборок вне GAC).
publisherPolicyapply="no" — игнорировать политики издателя.
Прочие параметры <runtime>
ПараметрОписаниеЗначение
<gcServer enabled="true" />Серверный GC.true/false.
<gcConcurrent enabled="true" />Параллельный GC.
<legacyUnhandledExceptionPolicy enabled="false" />Обратная совместимость с .NET 1.1.
<loadFromRemoteSources enabled="true" />Загрузка сборок из сети (UNC, HTTP).Требуется для Assembly.LoadFrom("//server/app.dll").
<generatePublisherEvidence enabled="false" />Отключить проверку подписи (ускоряет запуск).

<system.web> — настройки ASP.NET

СекцияОписание
compilationdebug="true", targetFramework="4.8", batch="true".
authenticationmode="Windows", mode="Forms".
authorization<allow users="*"/>, <deny users="?" />.
sessionStatemode="InProc", mode="StateServer", mode="SQLServer".
httpRuntimemaxRequestLength="4096", executionTimeout="110".
customErrorsmode="RemoteOnly", <error statusCode="404" redirect="404.htm" />.
pagesviewStateEncryptionMode="Always", controlRenderingCompatibilityVersion="4.8".

<system.data>

<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider"
invariant="System.Data.SQLite"
description=".NET Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>

Используется для регистрации ADO.NET-провайдеров.


15. Трансформации конфигурации (web.debug.config, web.release.config)

Механизм Visual Studio для изменения web.config при публикации.

15.1. Синтаксис трансформаций

АтрибутОписаниеПример
xdt:Transform="Replace"Полная замена элемента.<compilation xdt:Transform="Replace" debug="false" />
xdt:Transform="Insert"Вставка элемента.<add key="Feature" value="On" xdt:Transform="Insert" />
xdt:Transform="Remove"Удаление элемента.<add key="DebugOnly" xdt:Transform="Remove" />
xdt:Transform="RemoveAll"Удалить все совпадения.<add xdt:Transform="RemoveAll" xdt:Locator="XPath(//add[@key='Temp'])" />
xdt:Transform="SetAttributes"Замена атрибутов.<compilation xdt:Transform="SetAttributes" debug="false" />
xdt:Locator="Match(key)"Поиск по атрибуту key.<add key="LogLevel" xdt:Locator="Match(key)" xdt:Transform="SetAttributes" value="Warn" />

15.2. Автоматические трансформации (VS)

  • web.debug.config → применяется при сборке в Debug,
  • web.release.config → при Release,
  • web.{Profile}.config → при публикации с профилем Profile.

⚠️ Не работает с dotnet publish (только MSBuild + VS).
Альтернатива в .NET Core+: appsettings.{Environment}.json.


16. Внешние файлы конфигурации

16.1. configSource

Выносит секцию в отдельный файл:

<appSettings configSource="appSettings.secret.config" />
  • Файл должен содержать только содержимое секции, без <appSettings>.
  • Путь — относительно .config.
  • Файл не может находиться в другом каталоге (только рядом или глубже).

16.2. file (только для <appSettings>)

Аналогично, но позволяет объединять значения:

<appSettings file="local.overrides.config">
<add key="BaseUrl" value="https://prod.com" />
</appSettings>
  • local.overrides.config может переопределять BaseUrl и добавлять новые ключи.
  • Используется для локальных переопределений без коммита.

17. machine.config

Глобальный конфиг для всех приложений на машине. Расположение:

  • Windows:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config

  • Linux/macOS (mono):
    /etc/mono/4.0/machine.config

Содержит:

  • <configSections> по умолчанию,
  • <system.web> для ASP.NET,
  • <system.data> с провайдерами,
  • <runtime> с политиками по умолчанию.

⚠️ Изменение требует прав администратора.
Редко редактируется напрямую — предпочтительно переопределять в app.config.


18. Settings.settings и userSettings

Visual Studio генерирует Properties/Settings.settings, который компилируется в app.config.

18.1. appSettings vs userSettings

КритерийappSettingsuserSettings
ХранениеВ app.configВ %LocalAppData%\Company\Product\version\user.config
ДоступТолько чтение (ConfigurationManager.AppSettings)Чтение/запись (Properties.Settings.Default.Key = value;)
ОбластьПриложениеПользователь + машина
ШифрованиеНетПоддерживается через protectedData

18.2. userSettings в app.config

<userSettings>
<MyApp.Properties.Settings>
<setting name="WindowSize" serializeAs="String">
<value>800,600</value>
</setting>
<setting name="Theme" serializeAs="String">
<value>Dark</value>
</setting>
</MyApp.Properties.Settings>
</userSettings>

При изменении и вызове Settings.Default.Save(), значения пишутся в user.config.


19. WCF-конфигурация (system.serviceModel)

19.1. Структура

<system.serviceModel>
<services>
<service name="MyService" behaviorConfiguration="MyBehavior">
<endpoint address=""
binding="basicHttpBinding"
contract="IMyService" />
</service>
</services>

<bindings>
<basicHttpBinding>
<binding name="MyBinding" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" />
</binding>
</basicHttpBinding>
</bindings>

<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>

<client>
<endpoint address="http://..."
binding="wsHttpBinding"
contract="IMyService"
name="RemoteService" />
</client>
</system.serviceModel>

19.2. Ключевые узлы

УзелНазначение
servicesОпределение хостинга сервисов.
bindingsНастройка транспорта (HTTP, TCP, Named Pipes).
behaviorsДоп. поведение (метаданные, трассировка, throttling).
clientКонфигурация клиентских прокси.
diagnosticsВключение WCF-трассировки (<messageLogging logEntireMessage="true" />).

20. app.manifest — манифест приложения Windows

Контролирует:

  • UAC-поведение,
  • DPI-awareness,
  • поддержку Windows тем,
  • Visual Styles.

20.1. Подключение

В .csproj:

<ApplicationManifest>app.manifest</ApplicationManifest>

20.2. Пример

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="MyApp"
type="win32" />

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Поддержка Windows 10/11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>

<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<highResolutionScrollingAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</highResolutionScrollingAware>
</windowsSettings>
</application>
</assembly>
ПараметрОписание
level="asInvoker"Запуск без повышенных прав.
level="requireAdministrator"Требовать права админа.
level="highestAvailable"Максимальные доступные права.
dpiAware="true/pm"Per-Monitor DPI Awareness (устаревший).
dpiAwareness="PerMonitorV2"Современный режим (Windows 10 1703+).

21. Дополнительно: CPVM и анализ

21.1. Directory.Packages.props — централизованное управление версиями

Файл в корне репозитория для CentralPackageVersionManagement.

<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>

<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
</ItemGroup>
</Project>

В .csproj:

<PackageReference Include="Newtonsoft.Json" />
<!-- версия берётся из Directory.Packages.props -->

Требует:

  • <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>,
  • NuGet >= 6.2 / .NET SDK >= 6.0.300.

21.2. FxCopRules.ruleset — устаревший анализ

Файл правил для Microsoft.CodeAnalysis.FxCopAnalyzers (до .NET 5).

<RuleSet Name="My Rules" ToolsVersion="16.0">
<Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
<Rule Id="CA1001" Action="Warning" />
<Rule Id="CA1822" Action="None" /> <!-- отключить -->
</Rules>
</RuleSet>

В .csproj:

<CodeAnalysisRuleSet>MyRules.ruleset</CodeAnalysisRuleSet>

⚠️ В .NET 5+ заменён на AnalysisLevel, AnalysisMode, .editorconfig.