[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-msbuild-modernization":3,"mdc--hz3tg3-key":34,"related-repo-dotnet-msbuild-modernization":3498,"related-org-dotnet-msbuild-modernization":3608},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"msbuild-modernization","migrate legacy projects to SDK-style MSBuild","Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj\u002F.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties\u002FAssemblyInfo.cs in favor of auto-generation, eliminating explicit \u003CCompile Include> lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, \u003CImport Project=\"$(MSBuildToolsPath)\">, .csproj files > 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19],{"name":13,"slug":14,"type":15},"Modernization","modernization","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Migration","migration",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-15T06:03:25.468261","MIT",332,[28],"agent-skills",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-msbuild\u002Fskills\u002Fmsbuild-modernization","---\nname: msbuild-modernization\ndescription: \"Guide for modernizing and migrating MSBuild project files to SDK-style format. USE FOR: converting legacy .csproj\u002F.vbproj with verbose XML to SDK-style, migrating packages.config to PackageReference, removing Properties\u002FAssemblyInfo.cs in favor of auto-generation, eliminating explicit \u003CCompile Include> lists via implicit globbing, consolidating shared settings into Directory.Build.props. Indicators of legacy projects: ToolsVersion attribute, \u003CImport Project=\\\"$(MSBuildToolsPath)\\\">, .csproj files > 50 lines for simple projects. DO NOT USE FOR: projects already in SDK-style format, non-.NET build systems (npm, Maven, CMake), .NET Framework projects that cannot move to SDK-style.\"\nlicense: MIT\n---\n\n# MSBuild Modernization: Legacy to SDK-style Migration\n\n## Identifying Legacy vs SDK-style Projects\n\n**Legacy indicators:**\n\n- `\u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>`\n- Explicit file lists (`\u003CCompile Include=\"...\" \u002F>` for every `.cs` file)\n- `ToolsVersion` attribute on `\u003CProject>` element\n- `packages.config` file present\n- `Properties\\AssemblyInfo.cs` with assembly-level attributes\n\n**SDK-style indicators:**\n\n- `\u003CProject Sdk=\"Microsoft.NET.Sdk\">` attribute on root element\n- Minimal content — a simple project may be 10–15 lines\n- No explicit file includes (implicit globbing)\n- `\u003CPackageReference>` items instead of `packages.config`\n\n**Quick check:** if a `.csproj` is more than 50 lines for a simple class library or console app, it is likely legacy format.\n\n```xml\n\u003C!-- Legacy: ~80+ lines for a simple library -->\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" \u002F>\n  \u003CPropertyGroup>\n    \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n    \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n    \u003COutputType>Library\u003C\u002FOutputType>\n    \u003CRootNamespace>MyLibrary\u003C\u002FRootNamespace>\n    \u003CAssemblyName>MyLibrary\u003C\u002FAssemblyName>\n    \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n    \u003CFileAlignment>512\u003C\u002FFileAlignment>\n    \u003CDeterministic>true\u003C\u002FDeterministic>\n  \u003C\u002FPropertyGroup>\n  \u003C!-- ... 60+ more lines ... -->\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n```\n\n```xml\n\u003C!-- SDK-style: ~8 lines for the same library -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n```\n\n## Migration Checklist: Legacy → SDK-style\n\n### Step 1: Replace Project Root Element\n\n**BEFORE:**\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\"\n          Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" \u002F>\n  \u003C!-- ... project content ... -->\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n```\n\n**AFTER:**\n\n```xml\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003C!-- ... project content ... -->\n\u003C\u002FProject>\n```\n\nRemove the XML declaration, `ToolsVersion`, `xmlns`, and both `\u003CImport>` lines. The `Sdk` attribute replaces all of them.\n\n### Step 2: Set TargetFramework\n\n**BEFORE:**\n\n```xml\n\u003CPropertyGroup>\n  \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n\u003C\u002FPropertyGroup>\n```\n\n**AFTER:**\n\n```xml\n\u003CPropertyGroup>\n  \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n\u003C\u002FPropertyGroup>\n```\n\n**TFM mapping table:**\n\n| Legacy `TargetFrameworkVersion` | SDK-style `TargetFramework` |\n|---------------------------------|-----------------------------|\n| `v4.6.1`                        | `net461`                    |\n| `v4.7.2`                        | `net472`                    |\n| `v4.8`                          | `net48`                     |\n| (migrating to .NET 6)           | `net6.0`                    |\n| (migrating to .NET 8)           | `net8.0`                    |\n\n### Step 3: Remove Explicit File Includes\n\n**BEFORE:**\n\n```xml\n\u003CItemGroup>\n  \u003CCompile Include=\"Controllers\\HomeController.cs\" \u002F>\n  \u003CCompile Include=\"Models\\User.cs\" \u002F>\n  \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n  \u003CCompile Include=\"Services\\AuthService.cs\" \u002F>\n  \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n  \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n  \u003C!-- ... 50+ more lines ... -->\n\u003C\u002FItemGroup>\n\u003CItemGroup>\n  \u003CContent Include=\"Views\\Home\\Index.cshtml\" \u002F>\n  \u003CContent Include=\"Views\\Shared\\_Layout.cshtml\" \u002F>\n  \u003C!-- ... more content files ... -->\n\u003C\u002FItemGroup>\n```\n\n**AFTER:**\n\nDelete all of these `\u003CCompile>` and `\u003CContent>` item groups entirely. SDK-style projects include them automatically via implicit globbing.\n\n**Exception:** keep explicit entries only for files that need special metadata or reside outside the project directory:\n\n```xml\n\u003CItemGroup>\n  \u003CContent Include=\"..\\shared\\config.json\" Link=\"config.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n\u003C\u002FItemGroup>\n```\n\n### Step 4: Remove AssemblyInfo.cs\n\n**BEFORE** (`Properties\\AssemblyInfo.cs`):\n\n```csharp\nusing System.Reflection;\nusing System.Runtime.InteropServices;\n\n[assembly: AssemblyTitle(\"MyLibrary\")]\n[assembly: AssemblyDescription(\"A useful library\")]\n[assembly: AssemblyCompany(\"Contoso\")]\n[assembly: AssemblyProduct(\"MyLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright © Contoso 2024\")]\n[assembly: ComVisible(false)]\n[assembly: Guid(\"...\")]\n[assembly: AssemblyVersion(\"1.2.0.0\")]\n[assembly: AssemblyFileVersion(\"1.2.0.0\")]\n```\n\n**AFTER** (in `.csproj`):\n\n```xml\n\u003CPropertyGroup>\n  \u003CAssemblyTitle>MyLibrary\u003C\u002FAssemblyTitle>\n  \u003CDescription>A useful library\u003C\u002FDescription>\n  \u003CCompany>Contoso\u003C\u002FCompany>\n  \u003CProduct>MyLibrary\u003C\u002FProduct>\n  \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n  \u003CVersion>1.2.0\u003C\u002FVersion>\n\u003C\u002FPropertyGroup>\n```\n\nDelete `Properties\\AssemblyInfo.cs` — the SDK auto-generates assembly attributes from these properties.\n\n**Alternative:** if you prefer to keep `AssemblyInfo.cs`, disable auto-generation:\n\n```xml\n\u003CPropertyGroup>\n  \u003CGenerateAssemblyInfo>false\u003C\u002FGenerateAssemblyInfo>\n\u003C\u002FPropertyGroup>\n```\n\n### Step 5: Migrate packages.config → PackageReference\n\n**BEFORE** (`packages.config`):\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Cpackages>\n  \u003Cpackage id=\"Newtonsoft.Json\" version=\"13.0.3\" targetFramework=\"net472\" \u002F>\n  \u003Cpackage id=\"Serilog\" version=\"3.1.1\" targetFramework=\"net472\" \u002F>\n  \u003Cpackage id=\"Microsoft.Extensions.DependencyInjection\" version=\"8.0.0\" targetFramework=\"net472\" \u002F>\n\u003C\u002Fpackages>\n```\n\n**AFTER** (in `.csproj`):\n\n```xml\n\u003CItemGroup>\n  \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n  \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n  \u003CPackageReference Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"8.0.0\" \u002F>\n\u003C\u002FItemGroup>\n```\n\nDelete `packages.config` after migration.\n\n**Migration options:**\n\n- **Visual Studio:** right-click `packages.config` → *Migrate packages.config to PackageReference*\n- **CLI:** `dotnet migrate-packages-config` or manual conversion\n- **Binding redirects:** SDK-style projects auto-generate binding redirects — remove the `\u003Cruntime>` section from `app.config` if present\n\n### Step 6: Remove Unnecessary Boilerplate\n\nDelete all of the following — the SDK provides sensible defaults:\n\n```xml\n\u003C!-- DELETE: SDK imports (replaced by Sdk attribute) -->\n\u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" ... \u002F>\n\u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\n\u003C!-- DELETE: default Configuration\u002FPlatform (SDK provides these) -->\n\u003CPropertyGroup>\n  \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n  \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n  \u003CProjectGuid>{...}\u003C\u002FProjectGuid>\n  \u003COutputType>Library\u003C\u002FOutputType>  \u003C!-- keep only if not Library -->\n  \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n  \u003CFileAlignment>512\u003C\u002FFileAlignment>\n  \u003CAutoGenerateBindingRedirects>true\u003C\u002FAutoGenerateBindingRedirects>\n  \u003CDeterministic>true\u003C\u002FDeterministic>\n\u003C\u002FPropertyGroup>\n\n\u003C!-- DELETE: standard Debug\u002FRelease configurations (SDK defaults match) -->\n\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n  \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n  \u003CDebugType>full\u003C\u002FDebugType>\n  \u003COptimize>false\u003C\u002FOptimize>\n  \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n  \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n  \u003CErrorReport>prompt\u003C\u002FErrorReport>\n  \u003CWarningLevel>4\u003C\u002FWarningLevel>\n\u003C\u002FPropertyGroup>\n\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n  \u003CDebugType>pdbonly\u003C\u002FDebugType>\n  \u003COptimize>true\u003C\u002FOptimize>\n  \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n  \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n  \u003CErrorReport>prompt\u003C\u002FErrorReport>\n  \u003CWarningLevel>4\u003C\u002FWarningLevel>\n\u003C\u002FPropertyGroup>\n\n\u003C!-- DELETE: framework assembly references (implicit in SDK) -->\n\u003CItemGroup>\n  \u003CReference Include=\"System\" \u002F>\n  \u003CReference Include=\"System.Core\" \u002F>\n  \u003CReference Include=\"System.Data\" \u002F>\n  \u003CReference Include=\"System.Xml\" \u002F>\n  \u003CReference Include=\"System.Xml.Linq\" \u002F>\n  \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n\u003C\u002FItemGroup>\n\n\u003C!-- DELETE: packages.config reference -->\n\u003CNone Include=\"packages.config\" \u002F>\n\n\u003C!-- DELETE: designer service entries -->\n\u003CService Include=\"{508349B6-6B84-11D3-8410-00C04F8EF8E0}\" \u002F>\n```\n\n**Keep** only properties that differ from SDK defaults (e.g., `\u003COutputType>Exe\u003C\u002FOutputType>`, `\u003CRootNamespace>` if it differs from the assembly name, custom `\u003CDefineConstants>`).\n\n### Step 7: Enable Modern Features\n\nAfter migration, consider enabling modern C# features:\n\n```xml\n\u003CPropertyGroup>\n  \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n  \u003CNullable>enable\u003C\u002FNullable>\n  \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n\u003C\u002FPropertyGroup>\n```\n\n- `\u003CNullable>enable\u003C\u002FNullable>` — enables nullable reference type analysis\n- `\u003CImplicitUsings>enable\u003C\u002FImplicitUsings>` — auto-imports common namespaces (.NET 6+)\n- **Avoid `\u003CLangVersion>latest`** — the effective language version is determined by the SDK\u002Fcompiler defaults, not just the TFM, so builds can silently vary across machines with different SDKs installed. Omit `\u003CLangVersion>` unless you need to pin a specific version. For reproducible builds, pin the SDK version repo-wide with `global.json` (which indirectly fixes the default language version), or set an explicit numeric `\u003CLangVersion>` (e.g. `\u003CLangVersion>12\u003C\u002FLangVersion>`) per project to directly control the language version.\n\n## Complete Before\u002FAfter Example\n\n**BEFORE** (legacy — 65 lines):\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\"\n          Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" \u002F>\n  \u003CPropertyGroup>\n    \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n    \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n    \u003CProjectGuid>{12345678-1234-1234-1234-123456789ABC}\u003C\u002FProjectGuid>\n    \u003COutputType>Library\u003C\u002FOutputType>\n    \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n    \u003CRootNamespace>MyLibrary\u003C\u002FRootNamespace>\n    \u003CAssemblyName>MyLibrary\u003C\u002FAssemblyName>\n    \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n    \u003CFileAlignment>512\u003C\u002FFileAlignment>\n    \u003CDeterministic>true\u003C\u002FDeterministic>\n  \u003C\u002FPropertyGroup>\n  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n    \u003CDebugType>full\u003C\u002FDebugType>\n    \u003COptimize>false\u003C\u002FOptimize>\n    \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n    \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n    \u003CErrorReport>prompt\u003C\u002FErrorReport>\n    \u003CWarningLevel>4\u003C\u002FWarningLevel>\n  \u003C\u002FPropertyGroup>\n  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    \u003CDebugType>pdbonly\u003C\u002FDebugType>\n    \u003COptimize>true\u003C\u002FOptimize>\n    \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n    \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n    \u003CErrorReport>prompt\u003C\u002FErrorReport>\n    \u003CWarningLevel>4\u003C\u002FWarningLevel>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CReference Include=\"System\" \u002F>\n    \u003CReference Include=\"System.Core\" \u002F>\n    \u003CReference Include=\"System.Xml.Linq\" \u002F>\n    \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CItemGroup>\n    \u003CCompile Include=\"Models\\User.cs\" \u002F>\n    \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n    \u003CCompile Include=\"Services\\UserService.cs\" \u002F>\n    \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n    \u003CCompile Include=\"Helpers\\StringExtensions.cs\" \u002F>\n    \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CItemGroup>\n    \u003CNone Include=\"packages.config\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n```\n\n**AFTER** (SDK-style — 11 lines):\n\n```xml\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n    \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n```\n\n## Common Migration Issues\n\n**Embedded resources:** files not in a standard location may need explicit includes:\n\n```xml\n\u003CItemGroup>\n  \u003CEmbeddedResource Include=\"..\\shared\\Schemas\\*.xsd\" LinkBase=\"Schemas\" \u002F>\n\u003C\u002FItemGroup>\n```\n\n**Content files with CopyToOutputDirectory:** these still need explicit entries:\n\n```xml\n\u003CItemGroup>\n  \u003CContent Include=\"appsettings.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n  \u003CNone Include=\"scripts\\*.sql\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n\u003C\u002FItemGroup>\n```\n\n**Multi-targeting:** change the element name from singular to plural:\n\n```xml\n\u003C!-- Single target -->\n\u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n\n\u003C!-- Multiple targets -->\n\u003CTargetFrameworks>net472;net8.0\u003C\u002FTargetFrameworks>\n```\n\n**WPF\u002FWinForms projects:** use the appropriate SDK or properties:\n\n```xml\n\u003C!-- Option A: WindowsDesktop SDK -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\u003C!-- Option B: properties in standard SDK (preferred for .NET 5+) -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CUseWPF>true\u003C\u002FUseWPF>\n    \u003C!-- or -->\n    \u003CUseWindowsForms>true\u003C\u002FUseWindowsForms>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n```\n\n**Test projects:** use the standard SDK with test framework packages:\n\n```xml\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n    \u003CIsPackable>false\u003C\u002FIsPackable>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.9.0\" \u002F>\n    \u003CPackageReference Include=\"xunit\" Version=\"2.7.0\" \u002F>\n    \u003CPackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.5.7\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n```\n\n## Central Package Management Migration\n\nCentralizes NuGet version management across a multi-project solution. See [https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fnuget\u002Fconsume-packages\u002Fcentral-package-management](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fnuget\u002Fconsume-packages\u002Fcentral-package-management) for details.\n\n**Step 1:** Create `Directory.Packages.props` at the repository root with `\u003CManagePackageVersionsCentrally>true\u003C\u002FManagePackageVersionsCentrally>` and `\u003CPackageVersion>` items for all packages.\n\n**Step 2:** Remove `Version` from each project's `PackageReference`:\n\n```xml\n\u003C!-- BEFORE -->\n\u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n\n\u003C!-- AFTER -->\n\u003CPackageReference Include=\"Newtonsoft.Json\" \u002F>\n```\n\n## Directory.Build Consolidation\n\nIdentify properties repeated across multiple `.csproj` files and move them to shared files.\n\n**`Directory.Build.props`** (for properties — placed at repo or src root):\n\n```xml\n\u003CProject>\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n    \u003CNullable>enable\u003C\u002FNullable>\n    \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n    \u003CTreatWarningsAsErrors>true\u003C\u002FTreatWarningsAsErrors>\n    \u003CCompany>Contoso\u003C\u002FCompany>\n    \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n```\n\n**`Directory.Build.targets`** (for targets\u002Ftasks — placed at repo or src root):\n\n```xml\n\u003CProject>\n  \u003CTarget Name=\"PrintBuildInfo\" AfterTargets=\"Build\">\n    \u003CMessage Importance=\"High\" Text=\"Built $(AssemblyName) → $(TargetPath)\" \u002F>\n  \u003C\u002FTarget>\n\u003C\u002FProject>\n```\n\n**Keep in individual `.csproj` files** only what is project-specific:\n\n```xml\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003COutputType>Exe\u003C\u002FOutputType>\n    \u003CAssemblyName>MyApp\u003C\u002FAssemblyName>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Serilog\" \u002F>\n    \u003CProjectReference Include=\"..\\MyLibrary\\MyLibrary.csproj\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n```\n\n## Tools and Automation\n\n| Tool | Usage |\n|------|-------|\n| `dotnet try-convert` | Automated legacy-to-SDK conversion. Install: `dotnet tool install -g try-convert` |\n| .NET Upgrade Assistant | Full migration including API changes. Install: `dotnet tool install -g upgrade-assistant` |\n| Visual Studio | Right-click `packages.config` → *Migrate packages.config to PackageReference* |\n| Manual migration | Often cleanest for simple projects — follow the checklist above |\n\n**Recommended approach:**\n\n1. Run `try-convert` for a first pass\n2. Review and clean up the output manually\n3. Build and fix any issues\n4. Enable modern features (nullable, implicit usings)\n5. Consolidate shared settings into `Directory.Build.props`\n",{"data":35,"body":36},{"name":4,"description":6,"license":25},{"type":37,"children":38},"root",[39,48,55,65,142,150,190,208,374,426,432,439,447,506,514,542,578,584,591,622,629,658,666,803,809,816,933,940,961,971,1000,1006,1023,1129,1145,1214,1226,1244,1273,1279,1293,1347,1361,1406,1417,1425,1495,1501,1506,1933,1966,1972,1977,2022,2094,2100,2109,2510,2519,2591,2597,2607,2636,2646,2683,2693,2739,2749,2839,2849,2938,2944,2959,2992,3018,3064,3070,3082,3096,3179,3193,3238,3255,3336,3342,3442,3450,3492],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"msbuild-modernization-legacy-to-sdk-style-migration",[45],{"type":46,"value":47},"text","MSBuild Modernization: Legacy to SDK-style Migration",{"type":40,"tag":49,"props":50,"children":52},"h2",{"id":51},"identifying-legacy-vs-sdk-style-projects",[53],{"type":46,"value":54},"Identifying Legacy vs SDK-style Projects",{"type":40,"tag":56,"props":57,"children":58},"p",{},[59],{"type":40,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":46,"value":64},"Legacy indicators:",{"type":40,"tag":66,"props":67,"children":68},"ul",{},[69,80,101,120,131],{"type":40,"tag":70,"props":71,"children":72},"li",{},[73],{"type":40,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":46,"value":79},"\u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>",{"type":40,"tag":70,"props":81,"children":82},{},[83,85,91,93,99],{"type":46,"value":84},"Explicit file lists (",{"type":40,"tag":74,"props":86,"children":88},{"className":87},[],[89],{"type":46,"value":90},"\u003CCompile Include=\"...\" \u002F>",{"type":46,"value":92}," for every ",{"type":40,"tag":74,"props":94,"children":96},{"className":95},[],[97],{"type":46,"value":98},".cs",{"type":46,"value":100}," file)",{"type":40,"tag":70,"props":102,"children":103},{},[104,110,112,118],{"type":40,"tag":74,"props":105,"children":107},{"className":106},[],[108],{"type":46,"value":109},"ToolsVersion",{"type":46,"value":111}," attribute on ",{"type":40,"tag":74,"props":113,"children":115},{"className":114},[],[116],{"type":46,"value":117},"\u003CProject>",{"type":46,"value":119}," element",{"type":40,"tag":70,"props":121,"children":122},{},[123,129],{"type":40,"tag":74,"props":124,"children":126},{"className":125},[],[127],{"type":46,"value":128},"packages.config",{"type":46,"value":130}," file present",{"type":40,"tag":70,"props":132,"children":133},{},[134,140],{"type":40,"tag":74,"props":135,"children":137},{"className":136},[],[138],{"type":46,"value":139},"Properties\\AssemblyInfo.cs",{"type":46,"value":141}," with assembly-level attributes",{"type":40,"tag":56,"props":143,"children":144},{},[145],{"type":40,"tag":60,"props":146,"children":147},{},[148],{"type":46,"value":149},"SDK-style indicators:",{"type":40,"tag":66,"props":151,"children":152},{},[153,164,169,174],{"type":40,"tag":70,"props":154,"children":155},{},[156,162],{"type":40,"tag":74,"props":157,"children":159},{"className":158},[],[160],{"type":46,"value":161},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">",{"type":46,"value":163}," attribute on root element",{"type":40,"tag":70,"props":165,"children":166},{},[167],{"type":46,"value":168},"Minimal content — a simple project may be 10–15 lines",{"type":40,"tag":70,"props":170,"children":171},{},[172],{"type":46,"value":173},"No explicit file includes (implicit globbing)",{"type":40,"tag":70,"props":175,"children":176},{},[177,183,185],{"type":40,"tag":74,"props":178,"children":180},{"className":179},[],[181],{"type":46,"value":182},"\u003CPackageReference>",{"type":46,"value":184}," items instead of ",{"type":40,"tag":74,"props":186,"children":188},{"className":187},[],[189],{"type":46,"value":128},{"type":40,"tag":56,"props":191,"children":192},{},[193,198,200,206],{"type":40,"tag":60,"props":194,"children":195},{},[196],{"type":46,"value":197},"Quick check:",{"type":46,"value":199}," if a ",{"type":40,"tag":74,"props":201,"children":203},{"className":202},[],[204],{"type":46,"value":205},".csproj",{"type":46,"value":207}," is more than 50 lines for a simple class library or console app, it is likely legacy format.",{"type":40,"tag":209,"props":210,"children":215},"pre",{"className":211,"code":212,"language":213,"meta":214,"style":214},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- Legacy: ~80+ lines for a simple library -->\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" \u002F>\n  \u003CPropertyGroup>\n    \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n    \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n    \u003COutputType>Library\u003C\u002FOutputType>\n    \u003CRootNamespace>MyLibrary\u003C\u002FRootNamespace>\n    \u003CAssemblyName>MyLibrary\u003C\u002FAssemblyName>\n    \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n    \u003CFileAlignment>512\u003C\u002FFileAlignment>\n    \u003CDeterministic>true\u003C\u002FDeterministic>\n  \u003C\u002FPropertyGroup>\n  \u003C!-- ... 60+ more lines ... -->\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n","xml","",[216],{"type":40,"tag":74,"props":217,"children":218},{"__ignoreMap":214},[219,230,239,248,257,266,275,284,293,302,311,320,329,338,347,356,365],{"type":40,"tag":220,"props":221,"children":224},"span",{"class":222,"line":223},"line",1,[225],{"type":40,"tag":220,"props":226,"children":227},{},[228],{"type":46,"value":229},"\u003C!-- Legacy: ~80+ lines for a simple library -->\n",{"type":40,"tag":220,"props":231,"children":233},{"class":222,"line":232},2,[234],{"type":40,"tag":220,"props":235,"children":236},{},[237],{"type":46,"value":238},"\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n",{"type":40,"tag":220,"props":240,"children":242},{"class":222,"line":241},3,[243],{"type":40,"tag":220,"props":244,"children":245},{},[246],{"type":46,"value":247},"\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n",{"type":40,"tag":220,"props":249,"children":251},{"class":222,"line":250},4,[252],{"type":40,"tag":220,"props":253,"children":254},{},[255],{"type":46,"value":256},"  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" \u002F>\n",{"type":40,"tag":220,"props":258,"children":260},{"class":222,"line":259},5,[261],{"type":40,"tag":220,"props":262,"children":263},{},[264],{"type":46,"value":265},"  \u003CPropertyGroup>\n",{"type":40,"tag":220,"props":267,"children":269},{"class":222,"line":268},6,[270],{"type":40,"tag":220,"props":271,"children":272},{},[273],{"type":46,"value":274},"    \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n",{"type":40,"tag":220,"props":276,"children":278},{"class":222,"line":277},7,[279],{"type":40,"tag":220,"props":280,"children":281},{},[282],{"type":46,"value":283},"    \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n",{"type":40,"tag":220,"props":285,"children":287},{"class":222,"line":286},8,[288],{"type":40,"tag":220,"props":289,"children":290},{},[291],{"type":46,"value":292},"    \u003COutputType>Library\u003C\u002FOutputType>\n",{"type":40,"tag":220,"props":294,"children":296},{"class":222,"line":295},9,[297],{"type":40,"tag":220,"props":298,"children":299},{},[300],{"type":46,"value":301},"    \u003CRootNamespace>MyLibrary\u003C\u002FRootNamespace>\n",{"type":40,"tag":220,"props":303,"children":305},{"class":222,"line":304},10,[306],{"type":40,"tag":220,"props":307,"children":308},{},[309],{"type":46,"value":310},"    \u003CAssemblyName>MyLibrary\u003C\u002FAssemblyName>\n",{"type":40,"tag":220,"props":312,"children":314},{"class":222,"line":313},11,[315],{"type":40,"tag":220,"props":316,"children":317},{},[318],{"type":46,"value":319},"    \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n",{"type":40,"tag":220,"props":321,"children":323},{"class":222,"line":322},12,[324],{"type":40,"tag":220,"props":325,"children":326},{},[327],{"type":46,"value":328},"    \u003CFileAlignment>512\u003C\u002FFileAlignment>\n",{"type":40,"tag":220,"props":330,"children":332},{"class":222,"line":331},13,[333],{"type":40,"tag":220,"props":334,"children":335},{},[336],{"type":46,"value":337},"    \u003CDeterministic>true\u003C\u002FDeterministic>\n",{"type":40,"tag":220,"props":339,"children":341},{"class":222,"line":340},14,[342],{"type":40,"tag":220,"props":343,"children":344},{},[345],{"type":46,"value":346},"  \u003C\u002FPropertyGroup>\n",{"type":40,"tag":220,"props":348,"children":350},{"class":222,"line":349},15,[351],{"type":40,"tag":220,"props":352,"children":353},{},[354],{"type":46,"value":355},"  \u003C!-- ... 60+ more lines ... -->\n",{"type":40,"tag":220,"props":357,"children":359},{"class":222,"line":358},16,[360],{"type":40,"tag":220,"props":361,"children":362},{},[363],{"type":46,"value":364},"  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n",{"type":40,"tag":220,"props":366,"children":368},{"class":222,"line":367},17,[369],{"type":40,"tag":220,"props":370,"children":371},{},[372],{"type":46,"value":373},"\u003C\u002FProject>\n",{"type":40,"tag":209,"props":375,"children":377},{"className":211,"code":376,"language":213,"meta":214,"style":214},"\u003C!-- SDK-style: ~8 lines for the same library -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n",[378],{"type":40,"tag":74,"props":379,"children":380},{"__ignoreMap":214},[381,389,397,404,412,419],{"type":40,"tag":220,"props":382,"children":383},{"class":222,"line":223},[384],{"type":40,"tag":220,"props":385,"children":386},{},[387],{"type":46,"value":388},"\u003C!-- SDK-style: ~8 lines for the same library -->\n",{"type":40,"tag":220,"props":390,"children":391},{"class":222,"line":232},[392],{"type":40,"tag":220,"props":393,"children":394},{},[395],{"type":46,"value":396},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n",{"type":40,"tag":220,"props":398,"children":399},{"class":222,"line":241},[400],{"type":40,"tag":220,"props":401,"children":402},{},[403],{"type":46,"value":265},{"type":40,"tag":220,"props":405,"children":406},{"class":222,"line":250},[407],{"type":40,"tag":220,"props":408,"children":409},{},[410],{"type":46,"value":411},"    \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n",{"type":40,"tag":220,"props":413,"children":414},{"class":222,"line":259},[415],{"type":40,"tag":220,"props":416,"children":417},{},[418],{"type":46,"value":346},{"type":40,"tag":220,"props":420,"children":421},{"class":222,"line":268},[422],{"type":40,"tag":220,"props":423,"children":424},{},[425],{"type":46,"value":373},{"type":40,"tag":49,"props":427,"children":429},{"id":428},"migration-checklist-legacy-sdk-style",[430],{"type":46,"value":431},"Migration Checklist: Legacy → SDK-style",{"type":40,"tag":433,"props":434,"children":436},"h3",{"id":435},"step-1-replace-project-root-element",[437],{"type":46,"value":438},"Step 1: Replace Project Root Element",{"type":40,"tag":56,"props":440,"children":441},{},[442],{"type":40,"tag":60,"props":443,"children":444},{},[445],{"type":46,"value":446},"BEFORE:",{"type":40,"tag":209,"props":448,"children":450},{"className":211,"code":449,"language":213,"meta":214,"style":214},"\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\"\n          Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" \u002F>\n  \u003C!-- ... project content ... -->\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n",[451],{"type":40,"tag":74,"props":452,"children":453},{"__ignoreMap":214},[454,461,468,476,484,492,499],{"type":40,"tag":220,"props":455,"children":456},{"class":222,"line":223},[457],{"type":40,"tag":220,"props":458,"children":459},{},[460],{"type":46,"value":238},{"type":40,"tag":220,"props":462,"children":463},{"class":222,"line":232},[464],{"type":40,"tag":220,"props":465,"children":466},{},[467],{"type":46,"value":247},{"type":40,"tag":220,"props":469,"children":470},{"class":222,"line":241},[471],{"type":40,"tag":220,"props":472,"children":473},{},[474],{"type":46,"value":475},"  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\"\n",{"type":40,"tag":220,"props":477,"children":478},{"class":222,"line":250},[479],{"type":40,"tag":220,"props":480,"children":481},{},[482],{"type":46,"value":483},"          Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" \u002F>\n",{"type":40,"tag":220,"props":485,"children":486},{"class":222,"line":259},[487],{"type":40,"tag":220,"props":488,"children":489},{},[490],{"type":46,"value":491},"  \u003C!-- ... project content ... -->\n",{"type":40,"tag":220,"props":493,"children":494},{"class":222,"line":268},[495],{"type":40,"tag":220,"props":496,"children":497},{},[498],{"type":46,"value":364},{"type":40,"tag":220,"props":500,"children":501},{"class":222,"line":277},[502],{"type":40,"tag":220,"props":503,"children":504},{},[505],{"type":46,"value":373},{"type":40,"tag":56,"props":507,"children":508},{},[509],{"type":40,"tag":60,"props":510,"children":511},{},[512],{"type":46,"value":513},"AFTER:",{"type":40,"tag":209,"props":515,"children":517},{"className":211,"code":516,"language":213,"meta":214,"style":214},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003C!-- ... project content ... -->\n\u003C\u002FProject>\n",[518],{"type":40,"tag":74,"props":519,"children":520},{"__ignoreMap":214},[521,528,535],{"type":40,"tag":220,"props":522,"children":523},{"class":222,"line":223},[524],{"type":40,"tag":220,"props":525,"children":526},{},[527],{"type":46,"value":396},{"type":40,"tag":220,"props":529,"children":530},{"class":222,"line":232},[531],{"type":40,"tag":220,"props":532,"children":533},{},[534],{"type":46,"value":491},{"type":40,"tag":220,"props":536,"children":537},{"class":222,"line":241},[538],{"type":40,"tag":220,"props":539,"children":540},{},[541],{"type":46,"value":373},{"type":40,"tag":56,"props":543,"children":544},{},[545,547,552,554,560,562,568,570,576],{"type":46,"value":546},"Remove the XML declaration, ",{"type":40,"tag":74,"props":548,"children":550},{"className":549},[],[551],{"type":46,"value":109},{"type":46,"value":553},", ",{"type":40,"tag":74,"props":555,"children":557},{"className":556},[],[558],{"type":46,"value":559},"xmlns",{"type":46,"value":561},", and both ",{"type":40,"tag":74,"props":563,"children":565},{"className":564},[],[566],{"type":46,"value":567},"\u003CImport>",{"type":46,"value":569}," lines. The ",{"type":40,"tag":74,"props":571,"children":573},{"className":572},[],[574],{"type":46,"value":575},"Sdk",{"type":46,"value":577}," attribute replaces all of them.",{"type":40,"tag":433,"props":579,"children":581},{"id":580},"step-2-set-targetframework",[582],{"type":46,"value":583},"Step 2: Set TargetFramework",{"type":40,"tag":56,"props":585,"children":586},{},[587],{"type":40,"tag":60,"props":588,"children":589},{},[590],{"type":46,"value":446},{"type":40,"tag":209,"props":592,"children":594},{"className":211,"code":593,"language":213,"meta":214,"style":214},"\u003CPropertyGroup>\n  \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n\u003C\u002FPropertyGroup>\n",[595],{"type":40,"tag":74,"props":596,"children":597},{"__ignoreMap":214},[598,606,614],{"type":40,"tag":220,"props":599,"children":600},{"class":222,"line":223},[601],{"type":40,"tag":220,"props":602,"children":603},{},[604],{"type":46,"value":605},"\u003CPropertyGroup>\n",{"type":40,"tag":220,"props":607,"children":608},{"class":222,"line":232},[609],{"type":40,"tag":220,"props":610,"children":611},{},[612],{"type":46,"value":613},"  \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n",{"type":40,"tag":220,"props":615,"children":616},{"class":222,"line":241},[617],{"type":40,"tag":220,"props":618,"children":619},{},[620],{"type":46,"value":621},"\u003C\u002FPropertyGroup>\n",{"type":40,"tag":56,"props":623,"children":624},{},[625],{"type":40,"tag":60,"props":626,"children":627},{},[628],{"type":46,"value":513},{"type":40,"tag":209,"props":630,"children":632},{"className":211,"code":631,"language":213,"meta":214,"style":214},"\u003CPropertyGroup>\n  \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n\u003C\u002FPropertyGroup>\n",[633],{"type":40,"tag":74,"props":634,"children":635},{"__ignoreMap":214},[636,643,651],{"type":40,"tag":220,"props":637,"children":638},{"class":222,"line":223},[639],{"type":40,"tag":220,"props":640,"children":641},{},[642],{"type":46,"value":605},{"type":40,"tag":220,"props":644,"children":645},{"class":222,"line":232},[646],{"type":40,"tag":220,"props":647,"children":648},{},[649],{"type":46,"value":650},"  \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n",{"type":40,"tag":220,"props":652,"children":653},{"class":222,"line":241},[654],{"type":40,"tag":220,"props":655,"children":656},{},[657],{"type":46,"value":621},{"type":40,"tag":56,"props":659,"children":660},{},[661],{"type":40,"tag":60,"props":662,"children":663},{},[664],{"type":46,"value":665},"TFM mapping table:",{"type":40,"tag":667,"props":668,"children":669},"table",{},[670,701],{"type":40,"tag":671,"props":672,"children":673},"thead",{},[674],{"type":40,"tag":675,"props":676,"children":677},"tr",{},[678,690],{"type":40,"tag":679,"props":680,"children":681},"th",{},[682,684],{"type":46,"value":683},"Legacy ",{"type":40,"tag":74,"props":685,"children":687},{"className":686},[],[688],{"type":46,"value":689},"TargetFrameworkVersion",{"type":40,"tag":679,"props":691,"children":692},{},[693,695],{"type":46,"value":694},"SDK-style ",{"type":40,"tag":74,"props":696,"children":698},{"className":697},[],[699],{"type":46,"value":700},"TargetFramework",{"type":40,"tag":702,"props":703,"children":704},"tbody",{},[705,727,748,769,786],{"type":40,"tag":675,"props":706,"children":707},{},[708,718],{"type":40,"tag":709,"props":710,"children":711},"td",{},[712],{"type":40,"tag":74,"props":713,"children":715},{"className":714},[],[716],{"type":46,"value":717},"v4.6.1",{"type":40,"tag":709,"props":719,"children":720},{},[721],{"type":40,"tag":74,"props":722,"children":724},{"className":723},[],[725],{"type":46,"value":726},"net461",{"type":40,"tag":675,"props":728,"children":729},{},[730,739],{"type":40,"tag":709,"props":731,"children":732},{},[733],{"type":40,"tag":74,"props":734,"children":736},{"className":735},[],[737],{"type":46,"value":738},"v4.7.2",{"type":40,"tag":709,"props":740,"children":741},{},[742],{"type":40,"tag":74,"props":743,"children":745},{"className":744},[],[746],{"type":46,"value":747},"net472",{"type":40,"tag":675,"props":749,"children":750},{},[751,760],{"type":40,"tag":709,"props":752,"children":753},{},[754],{"type":40,"tag":74,"props":755,"children":757},{"className":756},[],[758],{"type":46,"value":759},"v4.8",{"type":40,"tag":709,"props":761,"children":762},{},[763],{"type":40,"tag":74,"props":764,"children":766},{"className":765},[],[767],{"type":46,"value":768},"net48",{"type":40,"tag":675,"props":770,"children":771},{},[772,777],{"type":40,"tag":709,"props":773,"children":774},{},[775],{"type":46,"value":776},"(migrating to .NET 6)",{"type":40,"tag":709,"props":778,"children":779},{},[780],{"type":40,"tag":74,"props":781,"children":783},{"className":782},[],[784],{"type":46,"value":785},"net6.0",{"type":40,"tag":675,"props":787,"children":788},{},[789,794],{"type":40,"tag":709,"props":790,"children":791},{},[792],{"type":46,"value":793},"(migrating to .NET 8)",{"type":40,"tag":709,"props":795,"children":796},{},[797],{"type":40,"tag":74,"props":798,"children":800},{"className":799},[],[801],{"type":46,"value":802},"net8.0",{"type":40,"tag":433,"props":804,"children":806},{"id":805},"step-3-remove-explicit-file-includes",[807],{"type":46,"value":808},"Step 3: Remove Explicit File Includes",{"type":40,"tag":56,"props":810,"children":811},{},[812],{"type":40,"tag":60,"props":813,"children":814},{},[815],{"type":46,"value":446},{"type":40,"tag":209,"props":817,"children":819},{"className":211,"code":818,"language":213,"meta":214,"style":214},"\u003CItemGroup>\n  \u003CCompile Include=\"Controllers\\HomeController.cs\" \u002F>\n  \u003CCompile Include=\"Models\\User.cs\" \u002F>\n  \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n  \u003CCompile Include=\"Services\\AuthService.cs\" \u002F>\n  \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n  \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n  \u003C!-- ... 50+ more lines ... -->\n\u003C\u002FItemGroup>\n\u003CItemGroup>\n  \u003CContent Include=\"Views\\Home\\Index.cshtml\" \u002F>\n  \u003CContent Include=\"Views\\Shared\\_Layout.cshtml\" \u002F>\n  \u003C!-- ... more content files ... -->\n\u003C\u002FItemGroup>\n",[820],{"type":40,"tag":74,"props":821,"children":822},{"__ignoreMap":214},[823,831,839,847,855,863,871,879,887,895,902,910,918,926],{"type":40,"tag":220,"props":824,"children":825},{"class":222,"line":223},[826],{"type":40,"tag":220,"props":827,"children":828},{},[829],{"type":46,"value":830},"\u003CItemGroup>\n",{"type":40,"tag":220,"props":832,"children":833},{"class":222,"line":232},[834],{"type":40,"tag":220,"props":835,"children":836},{},[837],{"type":46,"value":838},"  \u003CCompile Include=\"Controllers\\HomeController.cs\" \u002F>\n",{"type":40,"tag":220,"props":840,"children":841},{"class":222,"line":241},[842],{"type":40,"tag":220,"props":843,"children":844},{},[845],{"type":46,"value":846},"  \u003CCompile Include=\"Models\\User.cs\" \u002F>\n",{"type":40,"tag":220,"props":848,"children":849},{"class":222,"line":250},[850],{"type":40,"tag":220,"props":851,"children":852},{},[853],{"type":46,"value":854},"  \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n",{"type":40,"tag":220,"props":856,"children":857},{"class":222,"line":259},[858],{"type":40,"tag":220,"props":859,"children":860},{},[861],{"type":46,"value":862},"  \u003CCompile Include=\"Services\\AuthService.cs\" \u002F>\n",{"type":40,"tag":220,"props":864,"children":865},{"class":222,"line":268},[866],{"type":40,"tag":220,"props":867,"children":868},{},[869],{"type":46,"value":870},"  \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n",{"type":40,"tag":220,"props":872,"children":873},{"class":222,"line":277},[874],{"type":40,"tag":220,"props":875,"children":876},{},[877],{"type":46,"value":878},"  \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n",{"type":40,"tag":220,"props":880,"children":881},{"class":222,"line":286},[882],{"type":40,"tag":220,"props":883,"children":884},{},[885],{"type":46,"value":886},"  \u003C!-- ... 50+ more lines ... -->\n",{"type":40,"tag":220,"props":888,"children":889},{"class":222,"line":295},[890],{"type":40,"tag":220,"props":891,"children":892},{},[893],{"type":46,"value":894},"\u003C\u002FItemGroup>\n",{"type":40,"tag":220,"props":896,"children":897},{"class":222,"line":304},[898],{"type":40,"tag":220,"props":899,"children":900},{},[901],{"type":46,"value":830},{"type":40,"tag":220,"props":903,"children":904},{"class":222,"line":313},[905],{"type":40,"tag":220,"props":906,"children":907},{},[908],{"type":46,"value":909},"  \u003CContent Include=\"Views\\Home\\Index.cshtml\" \u002F>\n",{"type":40,"tag":220,"props":911,"children":912},{"class":222,"line":322},[913],{"type":40,"tag":220,"props":914,"children":915},{},[916],{"type":46,"value":917},"  \u003CContent Include=\"Views\\Shared\\_Layout.cshtml\" \u002F>\n",{"type":40,"tag":220,"props":919,"children":920},{"class":222,"line":331},[921],{"type":40,"tag":220,"props":922,"children":923},{},[924],{"type":46,"value":925},"  \u003C!-- ... more content files ... -->\n",{"type":40,"tag":220,"props":927,"children":928},{"class":222,"line":340},[929],{"type":40,"tag":220,"props":930,"children":931},{},[932],{"type":46,"value":894},{"type":40,"tag":56,"props":934,"children":935},{},[936],{"type":40,"tag":60,"props":937,"children":938},{},[939],{"type":46,"value":513},{"type":40,"tag":56,"props":941,"children":942},{},[943,945,951,953,959],{"type":46,"value":944},"Delete all of these ",{"type":40,"tag":74,"props":946,"children":948},{"className":947},[],[949],{"type":46,"value":950},"\u003CCompile>",{"type":46,"value":952}," and ",{"type":40,"tag":74,"props":954,"children":956},{"className":955},[],[957],{"type":46,"value":958},"\u003CContent>",{"type":46,"value":960}," item groups entirely. SDK-style projects include them automatically via implicit globbing.",{"type":40,"tag":56,"props":962,"children":963},{},[964,969],{"type":40,"tag":60,"props":965,"children":966},{},[967],{"type":46,"value":968},"Exception:",{"type":46,"value":970}," keep explicit entries only for files that need special metadata or reside outside the project directory:",{"type":40,"tag":209,"props":972,"children":974},{"className":211,"code":973,"language":213,"meta":214,"style":214},"\u003CItemGroup>\n  \u003CContent Include=\"..\\shared\\config.json\" Link=\"config.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n\u003C\u002FItemGroup>\n",[975],{"type":40,"tag":74,"props":976,"children":977},{"__ignoreMap":214},[978,985,993],{"type":40,"tag":220,"props":979,"children":980},{"class":222,"line":223},[981],{"type":40,"tag":220,"props":982,"children":983},{},[984],{"type":46,"value":830},{"type":40,"tag":220,"props":986,"children":987},{"class":222,"line":232},[988],{"type":40,"tag":220,"props":989,"children":990},{},[991],{"type":46,"value":992},"  \u003CContent Include=\"..\\shared\\config.json\" Link=\"config.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n",{"type":40,"tag":220,"props":994,"children":995},{"class":222,"line":241},[996],{"type":40,"tag":220,"props":997,"children":998},{},[999],{"type":46,"value":894},{"type":40,"tag":433,"props":1001,"children":1003},{"id":1002},"step-4-remove-assemblyinfocs",[1004],{"type":46,"value":1005},"Step 4: Remove AssemblyInfo.cs",{"type":40,"tag":56,"props":1007,"children":1008},{},[1009,1014,1016,1021],{"type":40,"tag":60,"props":1010,"children":1011},{},[1012],{"type":46,"value":1013},"BEFORE",{"type":46,"value":1015}," (",{"type":40,"tag":74,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":46,"value":139},{"type":46,"value":1022},"):",{"type":40,"tag":209,"props":1024,"children":1028},{"className":1025,"code":1026,"language":1027,"meta":214,"style":214},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","using System.Reflection;\nusing System.Runtime.InteropServices;\n\n[assembly: AssemblyTitle(\"MyLibrary\")]\n[assembly: AssemblyDescription(\"A useful library\")]\n[assembly: AssemblyCompany(\"Contoso\")]\n[assembly: AssemblyProduct(\"MyLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright © Contoso 2024\")]\n[assembly: ComVisible(false)]\n[assembly: Guid(\"...\")]\n[assembly: AssemblyVersion(\"1.2.0.0\")]\n[assembly: AssemblyFileVersion(\"1.2.0.0\")]\n","csharp",[1029],{"type":40,"tag":74,"props":1030,"children":1031},{"__ignoreMap":214},[1032,1040,1048,1057,1065,1073,1081,1089,1097,1105,1113,1121],{"type":40,"tag":220,"props":1033,"children":1034},{"class":222,"line":223},[1035],{"type":40,"tag":220,"props":1036,"children":1037},{},[1038],{"type":46,"value":1039},"using System.Reflection;\n",{"type":40,"tag":220,"props":1041,"children":1042},{"class":222,"line":232},[1043],{"type":40,"tag":220,"props":1044,"children":1045},{},[1046],{"type":46,"value":1047},"using System.Runtime.InteropServices;\n",{"type":40,"tag":220,"props":1049,"children":1050},{"class":222,"line":241},[1051],{"type":40,"tag":220,"props":1052,"children":1054},{"emptyLinePlaceholder":1053},true,[1055],{"type":46,"value":1056},"\n",{"type":40,"tag":220,"props":1058,"children":1059},{"class":222,"line":250},[1060],{"type":40,"tag":220,"props":1061,"children":1062},{},[1063],{"type":46,"value":1064},"[assembly: AssemblyTitle(\"MyLibrary\")]\n",{"type":40,"tag":220,"props":1066,"children":1067},{"class":222,"line":259},[1068],{"type":40,"tag":220,"props":1069,"children":1070},{},[1071],{"type":46,"value":1072},"[assembly: AssemblyDescription(\"A useful library\")]\n",{"type":40,"tag":220,"props":1074,"children":1075},{"class":222,"line":268},[1076],{"type":40,"tag":220,"props":1077,"children":1078},{},[1079],{"type":46,"value":1080},"[assembly: AssemblyCompany(\"Contoso\")]\n",{"type":40,"tag":220,"props":1082,"children":1083},{"class":222,"line":277},[1084],{"type":40,"tag":220,"props":1085,"children":1086},{},[1087],{"type":46,"value":1088},"[assembly: AssemblyProduct(\"MyLibrary\")]\n",{"type":40,"tag":220,"props":1090,"children":1091},{"class":222,"line":286},[1092],{"type":40,"tag":220,"props":1093,"children":1094},{},[1095],{"type":46,"value":1096},"[assembly: AssemblyCopyright(\"Copyright © Contoso 2024\")]\n",{"type":40,"tag":220,"props":1098,"children":1099},{"class":222,"line":295},[1100],{"type":40,"tag":220,"props":1101,"children":1102},{},[1103],{"type":46,"value":1104},"[assembly: ComVisible(false)]\n",{"type":40,"tag":220,"props":1106,"children":1107},{"class":222,"line":304},[1108],{"type":40,"tag":220,"props":1109,"children":1110},{},[1111],{"type":46,"value":1112},"[assembly: Guid(\"...\")]\n",{"type":40,"tag":220,"props":1114,"children":1115},{"class":222,"line":313},[1116],{"type":40,"tag":220,"props":1117,"children":1118},{},[1119],{"type":46,"value":1120},"[assembly: AssemblyVersion(\"1.2.0.0\")]\n",{"type":40,"tag":220,"props":1122,"children":1123},{"class":222,"line":322},[1124],{"type":40,"tag":220,"props":1125,"children":1126},{},[1127],{"type":46,"value":1128},"[assembly: AssemblyFileVersion(\"1.2.0.0\")]\n",{"type":40,"tag":56,"props":1130,"children":1131},{},[1132,1137,1139,1144],{"type":40,"tag":60,"props":1133,"children":1134},{},[1135],{"type":46,"value":1136},"AFTER",{"type":46,"value":1138}," (in ",{"type":40,"tag":74,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":46,"value":205},{"type":46,"value":1022},{"type":40,"tag":209,"props":1146,"children":1148},{"className":211,"code":1147,"language":213,"meta":214,"style":214},"\u003CPropertyGroup>\n  \u003CAssemblyTitle>MyLibrary\u003C\u002FAssemblyTitle>\n  \u003CDescription>A useful library\u003C\u002FDescription>\n  \u003CCompany>Contoso\u003C\u002FCompany>\n  \u003CProduct>MyLibrary\u003C\u002FProduct>\n  \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n  \u003CVersion>1.2.0\u003C\u002FVersion>\n\u003C\u002FPropertyGroup>\n",[1149],{"type":40,"tag":74,"props":1150,"children":1151},{"__ignoreMap":214},[1152,1159,1167,1175,1183,1191,1199,1207],{"type":40,"tag":220,"props":1153,"children":1154},{"class":222,"line":223},[1155],{"type":40,"tag":220,"props":1156,"children":1157},{},[1158],{"type":46,"value":605},{"type":40,"tag":220,"props":1160,"children":1161},{"class":222,"line":232},[1162],{"type":40,"tag":220,"props":1163,"children":1164},{},[1165],{"type":46,"value":1166},"  \u003CAssemblyTitle>MyLibrary\u003C\u002FAssemblyTitle>\n",{"type":40,"tag":220,"props":1168,"children":1169},{"class":222,"line":241},[1170],{"type":40,"tag":220,"props":1171,"children":1172},{},[1173],{"type":46,"value":1174},"  \u003CDescription>A useful library\u003C\u002FDescription>\n",{"type":40,"tag":220,"props":1176,"children":1177},{"class":222,"line":250},[1178],{"type":40,"tag":220,"props":1179,"children":1180},{},[1181],{"type":46,"value":1182},"  \u003CCompany>Contoso\u003C\u002FCompany>\n",{"type":40,"tag":220,"props":1184,"children":1185},{"class":222,"line":259},[1186],{"type":40,"tag":220,"props":1187,"children":1188},{},[1189],{"type":46,"value":1190},"  \u003CProduct>MyLibrary\u003C\u002FProduct>\n",{"type":40,"tag":220,"props":1192,"children":1193},{"class":222,"line":268},[1194],{"type":40,"tag":220,"props":1195,"children":1196},{},[1197],{"type":46,"value":1198},"  \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n",{"type":40,"tag":220,"props":1200,"children":1201},{"class":222,"line":277},[1202],{"type":40,"tag":220,"props":1203,"children":1204},{},[1205],{"type":46,"value":1206},"  \u003CVersion>1.2.0\u003C\u002FVersion>\n",{"type":40,"tag":220,"props":1208,"children":1209},{"class":222,"line":286},[1210],{"type":40,"tag":220,"props":1211,"children":1212},{},[1213],{"type":46,"value":621},{"type":40,"tag":56,"props":1215,"children":1216},{},[1217,1219,1224],{"type":46,"value":1218},"Delete ",{"type":40,"tag":74,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":46,"value":139},{"type":46,"value":1225}," — the SDK auto-generates assembly attributes from these properties.",{"type":40,"tag":56,"props":1227,"children":1228},{},[1229,1234,1236,1242],{"type":40,"tag":60,"props":1230,"children":1231},{},[1232],{"type":46,"value":1233},"Alternative:",{"type":46,"value":1235}," if you prefer to keep ",{"type":40,"tag":74,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":46,"value":1241},"AssemblyInfo.cs",{"type":46,"value":1243},", disable auto-generation:",{"type":40,"tag":209,"props":1245,"children":1247},{"className":211,"code":1246,"language":213,"meta":214,"style":214},"\u003CPropertyGroup>\n  \u003CGenerateAssemblyInfo>false\u003C\u002FGenerateAssemblyInfo>\n\u003C\u002FPropertyGroup>\n",[1248],{"type":40,"tag":74,"props":1249,"children":1250},{"__ignoreMap":214},[1251,1258,1266],{"type":40,"tag":220,"props":1252,"children":1253},{"class":222,"line":223},[1254],{"type":40,"tag":220,"props":1255,"children":1256},{},[1257],{"type":46,"value":605},{"type":40,"tag":220,"props":1259,"children":1260},{"class":222,"line":232},[1261],{"type":40,"tag":220,"props":1262,"children":1263},{},[1264],{"type":46,"value":1265},"  \u003CGenerateAssemblyInfo>false\u003C\u002FGenerateAssemblyInfo>\n",{"type":40,"tag":220,"props":1267,"children":1268},{"class":222,"line":241},[1269],{"type":40,"tag":220,"props":1270,"children":1271},{},[1272],{"type":46,"value":621},{"type":40,"tag":433,"props":1274,"children":1276},{"id":1275},"step-5-migrate-packagesconfig-packagereference",[1277],{"type":46,"value":1278},"Step 5: Migrate packages.config → PackageReference",{"type":40,"tag":56,"props":1280,"children":1281},{},[1282,1286,1287,1292],{"type":40,"tag":60,"props":1283,"children":1284},{},[1285],{"type":46,"value":1013},{"type":46,"value":1015},{"type":40,"tag":74,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":46,"value":128},{"type":46,"value":1022},{"type":40,"tag":209,"props":1294,"children":1296},{"className":211,"code":1295,"language":213,"meta":214,"style":214},"\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003Cpackages>\n  \u003Cpackage id=\"Newtonsoft.Json\" version=\"13.0.3\" targetFramework=\"net472\" \u002F>\n  \u003Cpackage id=\"Serilog\" version=\"3.1.1\" targetFramework=\"net472\" \u002F>\n  \u003Cpackage id=\"Microsoft.Extensions.DependencyInjection\" version=\"8.0.0\" targetFramework=\"net472\" \u002F>\n\u003C\u002Fpackages>\n",[1297],{"type":40,"tag":74,"props":1298,"children":1299},{"__ignoreMap":214},[1300,1307,1315,1323,1331,1339],{"type":40,"tag":220,"props":1301,"children":1302},{"class":222,"line":223},[1303],{"type":40,"tag":220,"props":1304,"children":1305},{},[1306],{"type":46,"value":238},{"type":40,"tag":220,"props":1308,"children":1309},{"class":222,"line":232},[1310],{"type":40,"tag":220,"props":1311,"children":1312},{},[1313],{"type":46,"value":1314},"\u003Cpackages>\n",{"type":40,"tag":220,"props":1316,"children":1317},{"class":222,"line":241},[1318],{"type":40,"tag":220,"props":1319,"children":1320},{},[1321],{"type":46,"value":1322},"  \u003Cpackage id=\"Newtonsoft.Json\" version=\"13.0.3\" targetFramework=\"net472\" \u002F>\n",{"type":40,"tag":220,"props":1324,"children":1325},{"class":222,"line":250},[1326],{"type":40,"tag":220,"props":1327,"children":1328},{},[1329],{"type":46,"value":1330},"  \u003Cpackage id=\"Serilog\" version=\"3.1.1\" targetFramework=\"net472\" \u002F>\n",{"type":40,"tag":220,"props":1332,"children":1333},{"class":222,"line":259},[1334],{"type":40,"tag":220,"props":1335,"children":1336},{},[1337],{"type":46,"value":1338},"  \u003Cpackage id=\"Microsoft.Extensions.DependencyInjection\" version=\"8.0.0\" targetFramework=\"net472\" \u002F>\n",{"type":40,"tag":220,"props":1340,"children":1341},{"class":222,"line":268},[1342],{"type":40,"tag":220,"props":1343,"children":1344},{},[1345],{"type":46,"value":1346},"\u003C\u002Fpackages>\n",{"type":40,"tag":56,"props":1348,"children":1349},{},[1350,1354,1355,1360],{"type":40,"tag":60,"props":1351,"children":1352},{},[1353],{"type":46,"value":1136},{"type":46,"value":1138},{"type":40,"tag":74,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":46,"value":205},{"type":46,"value":1022},{"type":40,"tag":209,"props":1362,"children":1364},{"className":211,"code":1363,"language":213,"meta":214,"style":214},"\u003CItemGroup>\n  \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n  \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n  \u003CPackageReference Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"8.0.0\" \u002F>\n\u003C\u002FItemGroup>\n",[1365],{"type":40,"tag":74,"props":1366,"children":1367},{"__ignoreMap":214},[1368,1375,1383,1391,1399],{"type":40,"tag":220,"props":1369,"children":1370},{"class":222,"line":223},[1371],{"type":40,"tag":220,"props":1372,"children":1373},{},[1374],{"type":46,"value":830},{"type":40,"tag":220,"props":1376,"children":1377},{"class":222,"line":232},[1378],{"type":40,"tag":220,"props":1379,"children":1380},{},[1381],{"type":46,"value":1382},"  \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n",{"type":40,"tag":220,"props":1384,"children":1385},{"class":222,"line":241},[1386],{"type":40,"tag":220,"props":1387,"children":1388},{},[1389],{"type":46,"value":1390},"  \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n",{"type":40,"tag":220,"props":1392,"children":1393},{"class":222,"line":250},[1394],{"type":40,"tag":220,"props":1395,"children":1396},{},[1397],{"type":46,"value":1398},"  \u003CPackageReference Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"8.0.0\" \u002F>\n",{"type":40,"tag":220,"props":1400,"children":1401},{"class":222,"line":259},[1402],{"type":40,"tag":220,"props":1403,"children":1404},{},[1405],{"type":46,"value":894},{"type":40,"tag":56,"props":1407,"children":1408},{},[1409,1410,1415],{"type":46,"value":1218},{"type":40,"tag":74,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":46,"value":128},{"type":46,"value":1416}," after migration.",{"type":40,"tag":56,"props":1418,"children":1419},{},[1420],{"type":40,"tag":60,"props":1421,"children":1422},{},[1423],{"type":46,"value":1424},"Migration options:",{"type":40,"tag":66,"props":1426,"children":1427},{},[1428,1451,1469],{"type":40,"tag":70,"props":1429,"children":1430},{},[1431,1436,1438,1443,1445],{"type":40,"tag":60,"props":1432,"children":1433},{},[1434],{"type":46,"value":1435},"Visual Studio:",{"type":46,"value":1437}," right-click ",{"type":40,"tag":74,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":46,"value":128},{"type":46,"value":1444}," → ",{"type":40,"tag":1446,"props":1447,"children":1448},"em",{},[1449],{"type":46,"value":1450},"Migrate packages.config to PackageReference",{"type":40,"tag":70,"props":1452,"children":1453},{},[1454,1459,1461,1467],{"type":40,"tag":60,"props":1455,"children":1456},{},[1457],{"type":46,"value":1458},"CLI:",{"type":46,"value":1460}," ",{"type":40,"tag":74,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":46,"value":1466},"dotnet migrate-packages-config",{"type":46,"value":1468}," or manual conversion",{"type":40,"tag":70,"props":1470,"children":1471},{},[1472,1477,1479,1485,1487,1493],{"type":40,"tag":60,"props":1473,"children":1474},{},[1475],{"type":46,"value":1476},"Binding redirects:",{"type":46,"value":1478}," SDK-style projects auto-generate binding redirects — remove the ",{"type":40,"tag":74,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":46,"value":1484},"\u003Cruntime>",{"type":46,"value":1486}," section from ",{"type":40,"tag":74,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":46,"value":1492},"app.config",{"type":46,"value":1494}," if present",{"type":40,"tag":433,"props":1496,"children":1498},{"id":1497},"step-6-remove-unnecessary-boilerplate",[1499],{"type":46,"value":1500},"Step 6: Remove Unnecessary Boilerplate",{"type":40,"tag":56,"props":1502,"children":1503},{},[1504],{"type":46,"value":1505},"Delete all of the following — the SDK provides sensible defaults:",{"type":40,"tag":209,"props":1507,"children":1509},{"className":211,"code":1508,"language":213,"meta":214,"style":214},"\u003C!-- DELETE: SDK imports (replaced by Sdk attribute) -->\n\u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" ... \u002F>\n\u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\n\u003C!-- DELETE: default Configuration\u002FPlatform (SDK provides these) -->\n\u003CPropertyGroup>\n  \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n  \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n  \u003CProjectGuid>{...}\u003C\u002FProjectGuid>\n  \u003COutputType>Library\u003C\u002FOutputType>  \u003C!-- keep only if not Library -->\n  \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n  \u003CFileAlignment>512\u003C\u002FFileAlignment>\n  \u003CAutoGenerateBindingRedirects>true\u003C\u002FAutoGenerateBindingRedirects>\n  \u003CDeterministic>true\u003C\u002FDeterministic>\n\u003C\u002FPropertyGroup>\n\n\u003C!-- DELETE: standard Debug\u002FRelease configurations (SDK defaults match) -->\n\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n  \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n  \u003CDebugType>full\u003C\u002FDebugType>\n  \u003COptimize>false\u003C\u002FOptimize>\n  \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n  \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n  \u003CErrorReport>prompt\u003C\u002FErrorReport>\n  \u003CWarningLevel>4\u003C\u002FWarningLevel>\n\u003C\u002FPropertyGroup>\n\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n  \u003CDebugType>pdbonly\u003C\u002FDebugType>\n  \u003COptimize>true\u003C\u002FOptimize>\n  \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n  \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n  \u003CErrorReport>prompt\u003C\u002FErrorReport>\n  \u003CWarningLevel>4\u003C\u002FWarningLevel>\n\u003C\u002FPropertyGroup>\n\n\u003C!-- DELETE: framework assembly references (implicit in SDK) -->\n\u003CItemGroup>\n  \u003CReference Include=\"System\" \u002F>\n  \u003CReference Include=\"System.Core\" \u002F>\n  \u003CReference Include=\"System.Data\" \u002F>\n  \u003CReference Include=\"System.Xml\" \u002F>\n  \u003CReference Include=\"System.Xml.Linq\" \u002F>\n  \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n\u003C\u002FItemGroup>\n\n\u003C!-- DELETE: packages.config reference -->\n\u003CNone Include=\"packages.config\" \u002F>\n\n\u003C!-- DELETE: designer service entries -->\n\u003CService Include=\"{508349B6-6B84-11D3-8410-00C04F8EF8E0}\" \u002F>\n",[1510],{"type":40,"tag":74,"props":1511,"children":1512},{"__ignoreMap":214},[1513,1521,1529,1537,1544,1552,1559,1567,1575,1583,1591,1599,1607,1615,1623,1630,1637,1645,1654,1663,1672,1681,1690,1699,1708,1717,1725,1734,1743,1752,1761,1770,1778,1786,1794,1802,1811,1819,1828,1837,1846,1855,1864,1873,1881,1889,1898,1907,1915,1924],{"type":40,"tag":220,"props":1514,"children":1515},{"class":222,"line":223},[1516],{"type":40,"tag":220,"props":1517,"children":1518},{},[1519],{"type":46,"value":1520},"\u003C!-- DELETE: SDK imports (replaced by Sdk attribute) -->\n",{"type":40,"tag":220,"props":1522,"children":1523},{"class":222,"line":232},[1524],{"type":40,"tag":220,"props":1525,"children":1526},{},[1527],{"type":46,"value":1528},"\u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" ... \u002F>\n",{"type":40,"tag":220,"props":1530,"children":1531},{"class":222,"line":241},[1532],{"type":40,"tag":220,"props":1533,"children":1534},{},[1535],{"type":46,"value":1536},"\u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n",{"type":40,"tag":220,"props":1538,"children":1539},{"class":222,"line":250},[1540],{"type":40,"tag":220,"props":1541,"children":1542},{"emptyLinePlaceholder":1053},[1543],{"type":46,"value":1056},{"type":40,"tag":220,"props":1545,"children":1546},{"class":222,"line":259},[1547],{"type":40,"tag":220,"props":1548,"children":1549},{},[1550],{"type":46,"value":1551},"\u003C!-- DELETE: default Configuration\u002FPlatform (SDK provides these) -->\n",{"type":40,"tag":220,"props":1553,"children":1554},{"class":222,"line":268},[1555],{"type":40,"tag":220,"props":1556,"children":1557},{},[1558],{"type":46,"value":605},{"type":40,"tag":220,"props":1560,"children":1561},{"class":222,"line":277},[1562],{"type":40,"tag":220,"props":1563,"children":1564},{},[1565],{"type":46,"value":1566},"  \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n",{"type":40,"tag":220,"props":1568,"children":1569},{"class":222,"line":286},[1570],{"type":40,"tag":220,"props":1571,"children":1572},{},[1573],{"type":46,"value":1574},"  \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n",{"type":40,"tag":220,"props":1576,"children":1577},{"class":222,"line":295},[1578],{"type":40,"tag":220,"props":1579,"children":1580},{},[1581],{"type":46,"value":1582},"  \u003CProjectGuid>{...}\u003C\u002FProjectGuid>\n",{"type":40,"tag":220,"props":1584,"children":1585},{"class":222,"line":304},[1586],{"type":40,"tag":220,"props":1587,"children":1588},{},[1589],{"type":46,"value":1590},"  \u003COutputType>Library\u003C\u002FOutputType>  \u003C!-- keep only if not Library -->\n",{"type":40,"tag":220,"props":1592,"children":1593},{"class":222,"line":313},[1594],{"type":40,"tag":220,"props":1595,"children":1596},{},[1597],{"type":46,"value":1598},"  \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n",{"type":40,"tag":220,"props":1600,"children":1601},{"class":222,"line":322},[1602],{"type":40,"tag":220,"props":1603,"children":1604},{},[1605],{"type":46,"value":1606},"  \u003CFileAlignment>512\u003C\u002FFileAlignment>\n",{"type":40,"tag":220,"props":1608,"children":1609},{"class":222,"line":331},[1610],{"type":40,"tag":220,"props":1611,"children":1612},{},[1613],{"type":46,"value":1614},"  \u003CAutoGenerateBindingRedirects>true\u003C\u002FAutoGenerateBindingRedirects>\n",{"type":40,"tag":220,"props":1616,"children":1617},{"class":222,"line":340},[1618],{"type":40,"tag":220,"props":1619,"children":1620},{},[1621],{"type":46,"value":1622},"  \u003CDeterministic>true\u003C\u002FDeterministic>\n",{"type":40,"tag":220,"props":1624,"children":1625},{"class":222,"line":349},[1626],{"type":40,"tag":220,"props":1627,"children":1628},{},[1629],{"type":46,"value":621},{"type":40,"tag":220,"props":1631,"children":1632},{"class":222,"line":358},[1633],{"type":40,"tag":220,"props":1634,"children":1635},{"emptyLinePlaceholder":1053},[1636],{"type":46,"value":1056},{"type":40,"tag":220,"props":1638,"children":1639},{"class":222,"line":367},[1640],{"type":40,"tag":220,"props":1641,"children":1642},{},[1643],{"type":46,"value":1644},"\u003C!-- DELETE: standard Debug\u002FRelease configurations (SDK defaults match) -->\n",{"type":40,"tag":220,"props":1646,"children":1648},{"class":222,"line":1647},18,[1649],{"type":40,"tag":220,"props":1650,"children":1651},{},[1652],{"type":46,"value":1653},"\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n",{"type":40,"tag":220,"props":1655,"children":1657},{"class":222,"line":1656},19,[1658],{"type":40,"tag":220,"props":1659,"children":1660},{},[1661],{"type":46,"value":1662},"  \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n",{"type":40,"tag":220,"props":1664,"children":1666},{"class":222,"line":1665},20,[1667],{"type":40,"tag":220,"props":1668,"children":1669},{},[1670],{"type":46,"value":1671},"  \u003CDebugType>full\u003C\u002FDebugType>\n",{"type":40,"tag":220,"props":1673,"children":1675},{"class":222,"line":1674},21,[1676],{"type":40,"tag":220,"props":1677,"children":1678},{},[1679],{"type":46,"value":1680},"  \u003COptimize>false\u003C\u002FOptimize>\n",{"type":40,"tag":220,"props":1682,"children":1684},{"class":222,"line":1683},22,[1685],{"type":40,"tag":220,"props":1686,"children":1687},{},[1688],{"type":46,"value":1689},"  \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n",{"type":40,"tag":220,"props":1691,"children":1693},{"class":222,"line":1692},23,[1694],{"type":40,"tag":220,"props":1695,"children":1696},{},[1697],{"type":46,"value":1698},"  \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n",{"type":40,"tag":220,"props":1700,"children":1702},{"class":222,"line":1701},24,[1703],{"type":40,"tag":220,"props":1704,"children":1705},{},[1706],{"type":46,"value":1707},"  \u003CErrorReport>prompt\u003C\u002FErrorReport>\n",{"type":40,"tag":220,"props":1709,"children":1711},{"class":222,"line":1710},25,[1712],{"type":40,"tag":220,"props":1713,"children":1714},{},[1715],{"type":46,"value":1716},"  \u003CWarningLevel>4\u003C\u002FWarningLevel>\n",{"type":40,"tag":220,"props":1718,"children":1720},{"class":222,"line":1719},26,[1721],{"type":40,"tag":220,"props":1722,"children":1723},{},[1724],{"type":46,"value":621},{"type":40,"tag":220,"props":1726,"children":1728},{"class":222,"line":1727},27,[1729],{"type":40,"tag":220,"props":1730,"children":1731},{},[1732],{"type":46,"value":1733},"\u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n",{"type":40,"tag":220,"props":1735,"children":1737},{"class":222,"line":1736},28,[1738],{"type":40,"tag":220,"props":1739,"children":1740},{},[1741],{"type":46,"value":1742},"  \u003CDebugType>pdbonly\u003C\u002FDebugType>\n",{"type":40,"tag":220,"props":1744,"children":1746},{"class":222,"line":1745},29,[1747],{"type":40,"tag":220,"props":1748,"children":1749},{},[1750],{"type":46,"value":1751},"  \u003COptimize>true\u003C\u002FOptimize>\n",{"type":40,"tag":220,"props":1753,"children":1755},{"class":222,"line":1754},30,[1756],{"type":40,"tag":220,"props":1757,"children":1758},{},[1759],{"type":46,"value":1760},"  \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n",{"type":40,"tag":220,"props":1762,"children":1764},{"class":222,"line":1763},31,[1765],{"type":40,"tag":220,"props":1766,"children":1767},{},[1768],{"type":46,"value":1769},"  \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n",{"type":40,"tag":220,"props":1771,"children":1773},{"class":222,"line":1772},32,[1774],{"type":40,"tag":220,"props":1775,"children":1776},{},[1777],{"type":46,"value":1707},{"type":40,"tag":220,"props":1779,"children":1781},{"class":222,"line":1780},33,[1782],{"type":40,"tag":220,"props":1783,"children":1784},{},[1785],{"type":46,"value":1716},{"type":40,"tag":220,"props":1787,"children":1789},{"class":222,"line":1788},34,[1790],{"type":40,"tag":220,"props":1791,"children":1792},{},[1793],{"type":46,"value":621},{"type":40,"tag":220,"props":1795,"children":1797},{"class":222,"line":1796},35,[1798],{"type":40,"tag":220,"props":1799,"children":1800},{"emptyLinePlaceholder":1053},[1801],{"type":46,"value":1056},{"type":40,"tag":220,"props":1803,"children":1805},{"class":222,"line":1804},36,[1806],{"type":40,"tag":220,"props":1807,"children":1808},{},[1809],{"type":46,"value":1810},"\u003C!-- DELETE: framework assembly references (implicit in SDK) -->\n",{"type":40,"tag":220,"props":1812,"children":1814},{"class":222,"line":1813},37,[1815],{"type":40,"tag":220,"props":1816,"children":1817},{},[1818],{"type":46,"value":830},{"type":40,"tag":220,"props":1820,"children":1822},{"class":222,"line":1821},38,[1823],{"type":40,"tag":220,"props":1824,"children":1825},{},[1826],{"type":46,"value":1827},"  \u003CReference Include=\"System\" \u002F>\n",{"type":40,"tag":220,"props":1829,"children":1831},{"class":222,"line":1830},39,[1832],{"type":40,"tag":220,"props":1833,"children":1834},{},[1835],{"type":46,"value":1836},"  \u003CReference Include=\"System.Core\" \u002F>\n",{"type":40,"tag":220,"props":1838,"children":1840},{"class":222,"line":1839},40,[1841],{"type":40,"tag":220,"props":1842,"children":1843},{},[1844],{"type":46,"value":1845},"  \u003CReference Include=\"System.Data\" \u002F>\n",{"type":40,"tag":220,"props":1847,"children":1849},{"class":222,"line":1848},41,[1850],{"type":40,"tag":220,"props":1851,"children":1852},{},[1853],{"type":46,"value":1854},"  \u003CReference Include=\"System.Xml\" \u002F>\n",{"type":40,"tag":220,"props":1856,"children":1858},{"class":222,"line":1857},42,[1859],{"type":40,"tag":220,"props":1860,"children":1861},{},[1862],{"type":46,"value":1863},"  \u003CReference Include=\"System.Xml.Linq\" \u002F>\n",{"type":40,"tag":220,"props":1865,"children":1867},{"class":222,"line":1866},43,[1868],{"type":40,"tag":220,"props":1869,"children":1870},{},[1871],{"type":46,"value":1872},"  \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n",{"type":40,"tag":220,"props":1874,"children":1876},{"class":222,"line":1875},44,[1877],{"type":40,"tag":220,"props":1878,"children":1879},{},[1880],{"type":46,"value":894},{"type":40,"tag":220,"props":1882,"children":1884},{"class":222,"line":1883},45,[1885],{"type":40,"tag":220,"props":1886,"children":1887},{"emptyLinePlaceholder":1053},[1888],{"type":46,"value":1056},{"type":40,"tag":220,"props":1890,"children":1892},{"class":222,"line":1891},46,[1893],{"type":40,"tag":220,"props":1894,"children":1895},{},[1896],{"type":46,"value":1897},"\u003C!-- DELETE: packages.config reference -->\n",{"type":40,"tag":220,"props":1899,"children":1901},{"class":222,"line":1900},47,[1902],{"type":40,"tag":220,"props":1903,"children":1904},{},[1905],{"type":46,"value":1906},"\u003CNone Include=\"packages.config\" \u002F>\n",{"type":40,"tag":220,"props":1908,"children":1910},{"class":222,"line":1909},48,[1911],{"type":40,"tag":220,"props":1912,"children":1913},{"emptyLinePlaceholder":1053},[1914],{"type":46,"value":1056},{"type":40,"tag":220,"props":1916,"children":1918},{"class":222,"line":1917},49,[1919],{"type":40,"tag":220,"props":1920,"children":1921},{},[1922],{"type":46,"value":1923},"\u003C!-- DELETE: designer service entries -->\n",{"type":40,"tag":220,"props":1925,"children":1927},{"class":222,"line":1926},50,[1928],{"type":40,"tag":220,"props":1929,"children":1930},{},[1931],{"type":46,"value":1932},"\u003CService Include=\"{508349B6-6B84-11D3-8410-00C04F8EF8E0}\" \u002F>\n",{"type":40,"tag":56,"props":1934,"children":1935},{},[1936,1941,1943,1949,1950,1956,1958,1964],{"type":40,"tag":60,"props":1937,"children":1938},{},[1939],{"type":46,"value":1940},"Keep",{"type":46,"value":1942}," only properties that differ from SDK defaults (e.g., ",{"type":40,"tag":74,"props":1944,"children":1946},{"className":1945},[],[1947],{"type":46,"value":1948},"\u003COutputType>Exe\u003C\u002FOutputType>",{"type":46,"value":553},{"type":40,"tag":74,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":46,"value":1955},"\u003CRootNamespace>",{"type":46,"value":1957}," if it differs from the assembly name, custom ",{"type":40,"tag":74,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":46,"value":1963},"\u003CDefineConstants>",{"type":46,"value":1965},").",{"type":40,"tag":433,"props":1967,"children":1969},{"id":1968},"step-7-enable-modern-features",[1970],{"type":46,"value":1971},"Step 7: Enable Modern Features",{"type":40,"tag":56,"props":1973,"children":1974},{},[1975],{"type":46,"value":1976},"After migration, consider enabling modern C# features:",{"type":40,"tag":209,"props":1978,"children":1980},{"className":211,"code":1979,"language":213,"meta":214,"style":214},"\u003CPropertyGroup>\n  \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n  \u003CNullable>enable\u003C\u002FNullable>\n  \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n\u003C\u002FPropertyGroup>\n",[1981],{"type":40,"tag":74,"props":1982,"children":1983},{"__ignoreMap":214},[1984,1991,1999,2007,2015],{"type":40,"tag":220,"props":1985,"children":1986},{"class":222,"line":223},[1987],{"type":40,"tag":220,"props":1988,"children":1989},{},[1990],{"type":46,"value":605},{"type":40,"tag":220,"props":1992,"children":1993},{"class":222,"line":232},[1994],{"type":40,"tag":220,"props":1995,"children":1996},{},[1997],{"type":46,"value":1998},"  \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n",{"type":40,"tag":220,"props":2000,"children":2001},{"class":222,"line":241},[2002],{"type":40,"tag":220,"props":2003,"children":2004},{},[2005],{"type":46,"value":2006},"  \u003CNullable>enable\u003C\u002FNullable>\n",{"type":40,"tag":220,"props":2008,"children":2009},{"class":222,"line":250},[2010],{"type":40,"tag":220,"props":2011,"children":2012},{},[2013],{"type":46,"value":2014},"  \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n",{"type":40,"tag":220,"props":2016,"children":2017},{"class":222,"line":259},[2018],{"type":40,"tag":220,"props":2019,"children":2020},{},[2021],{"type":46,"value":621},{"type":40,"tag":66,"props":2023,"children":2024},{},[2025,2036,2047],{"type":40,"tag":70,"props":2026,"children":2027},{},[2028,2034],{"type":40,"tag":74,"props":2029,"children":2031},{"className":2030},[],[2032],{"type":46,"value":2033},"\u003CNullable>enable\u003C\u002FNullable>",{"type":46,"value":2035}," — enables nullable reference type analysis",{"type":40,"tag":70,"props":2037,"children":2038},{},[2039,2045],{"type":40,"tag":74,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":46,"value":2044},"\u003CImplicitUsings>enable\u003C\u002FImplicitUsings>",{"type":46,"value":2046}," — auto-imports common namespaces (.NET 6+)",{"type":40,"tag":70,"props":2048,"children":2049},{},[2050,2061,2063,2069,2071,2077,2079,2084,2086,2092],{"type":40,"tag":60,"props":2051,"children":2052},{},[2053,2055],{"type":46,"value":2054},"Avoid ",{"type":40,"tag":74,"props":2056,"children":2058},{"className":2057},[],[2059],{"type":46,"value":2060},"\u003CLangVersion>latest",{"type":46,"value":2062}," — the effective language version is determined by the SDK\u002Fcompiler defaults, not just the TFM, so builds can silently vary across machines with different SDKs installed. Omit ",{"type":40,"tag":74,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":46,"value":2068},"\u003CLangVersion>",{"type":46,"value":2070}," unless you need to pin a specific version. For reproducible builds, pin the SDK version repo-wide with ",{"type":40,"tag":74,"props":2072,"children":2074},{"className":2073},[],[2075],{"type":46,"value":2076},"global.json",{"type":46,"value":2078}," (which indirectly fixes the default language version), or set an explicit numeric ",{"type":40,"tag":74,"props":2080,"children":2082},{"className":2081},[],[2083],{"type":46,"value":2068},{"type":46,"value":2085}," (e.g. ",{"type":40,"tag":74,"props":2087,"children":2089},{"className":2088},[],[2090],{"type":46,"value":2091},"\u003CLangVersion>12\u003C\u002FLangVersion>",{"type":46,"value":2093},") per project to directly control the language version.",{"type":40,"tag":49,"props":2095,"children":2097},{"id":2096},"complete-beforeafter-example",[2098],{"type":46,"value":2099},"Complete Before\u002FAfter Example",{"type":40,"tag":56,"props":2101,"children":2102},{},[2103,2107],{"type":40,"tag":60,"props":2104,"children":2105},{},[2106],{"type":46,"value":1013},{"type":46,"value":2108}," (legacy — 65 lines):",{"type":40,"tag":209,"props":2110,"children":2112},{"className":211,"code":2111,"language":213,"meta":214,"style":214},"\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CProject ToolsVersion=\"15.0\" xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdeveloper\u002Fmsbuild\u002F2003\">\n  \u003CImport Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\"\n          Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" \u002F>\n  \u003CPropertyGroup>\n    \u003CConfiguration Condition=\" '$(Configuration)' == '' \">Debug\u003C\u002FConfiguration>\n    \u003CPlatform Condition=\" '$(Platform)' == '' \">AnyCPU\u003C\u002FPlatform>\n    \u003CProjectGuid>{12345678-1234-1234-1234-123456789ABC}\u003C\u002FProjectGuid>\n    \u003COutputType>Library\u003C\u002FOutputType>\n    \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n    \u003CRootNamespace>MyLibrary\u003C\u002FRootNamespace>\n    \u003CAssemblyName>MyLibrary\u003C\u002FAssemblyName>\n    \u003CTargetFrameworkVersion>v4.7.2\u003C\u002FTargetFrameworkVersion>\n    \u003CFileAlignment>512\u003C\u002FFileAlignment>\n    \u003CDeterministic>true\u003C\u002FDeterministic>\n  \u003C\u002FPropertyGroup>\n  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n    \u003CDebugType>full\u003C\u002FDebugType>\n    \u003COptimize>false\u003C\u002FOptimize>\n    \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n    \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n    \u003CErrorReport>prompt\u003C\u002FErrorReport>\n    \u003CWarningLevel>4\u003C\u002FWarningLevel>\n  \u003C\u002FPropertyGroup>\n  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    \u003CDebugType>pdbonly\u003C\u002FDebugType>\n    \u003COptimize>true\u003C\u002FOptimize>\n    \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n    \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n    \u003CErrorReport>prompt\u003C\u002FErrorReport>\n    \u003CWarningLevel>4\u003C\u002FWarningLevel>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CReference Include=\"System\" \u002F>\n    \u003CReference Include=\"System.Core\" \u002F>\n    \u003CReference Include=\"System.Xml.Linq\" \u002F>\n    \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CItemGroup>\n    \u003CCompile Include=\"Models\\User.cs\" \u002F>\n    \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n    \u003CCompile Include=\"Services\\UserService.cs\" \u002F>\n    \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n    \u003CCompile Include=\"Helpers\\StringExtensions.cs\" \u002F>\n    \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CItemGroup>\n    \u003CNone Include=\"packages.config\" \u002F>\n  \u003C\u002FItemGroup>\n  \u003CImport Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" \u002F>\n\u003C\u002FProject>\n",[2113],{"type":40,"tag":74,"props":2114,"children":2115},{"__ignoreMap":214},[2116,2123,2130,2137,2144,2151,2158,2165,2173,2180,2188,2195,2202,2209,2216,2223,2230,2238,2246,2254,2262,2270,2278,2286,2294,2301,2309,2317,2325,2333,2341,2348,2355,2362,2370,2378,2386,2394,2402,2410,2417,2425,2433,2441,2449,2457,2465,2472,2479,2487,2494,2502],{"type":40,"tag":220,"props":2117,"children":2118},{"class":222,"line":223},[2119],{"type":40,"tag":220,"props":2120,"children":2121},{},[2122],{"type":46,"value":238},{"type":40,"tag":220,"props":2124,"children":2125},{"class":222,"line":232},[2126],{"type":40,"tag":220,"props":2127,"children":2128},{},[2129],{"type":46,"value":247},{"type":40,"tag":220,"props":2131,"children":2132},{"class":222,"line":241},[2133],{"type":40,"tag":220,"props":2134,"children":2135},{},[2136],{"type":46,"value":475},{"type":40,"tag":220,"props":2138,"children":2139},{"class":222,"line":250},[2140],{"type":40,"tag":220,"props":2141,"children":2142},{},[2143],{"type":46,"value":483},{"type":40,"tag":220,"props":2145,"children":2146},{"class":222,"line":259},[2147],{"type":40,"tag":220,"props":2148,"children":2149},{},[2150],{"type":46,"value":265},{"type":40,"tag":220,"props":2152,"children":2153},{"class":222,"line":268},[2154],{"type":40,"tag":220,"props":2155,"children":2156},{},[2157],{"type":46,"value":274},{"type":40,"tag":220,"props":2159,"children":2160},{"class":222,"line":277},[2161],{"type":40,"tag":220,"props":2162,"children":2163},{},[2164],{"type":46,"value":283},{"type":40,"tag":220,"props":2166,"children":2167},{"class":222,"line":286},[2168],{"type":40,"tag":220,"props":2169,"children":2170},{},[2171],{"type":46,"value":2172},"    \u003CProjectGuid>{12345678-1234-1234-1234-123456789ABC}\u003C\u002FProjectGuid>\n",{"type":40,"tag":220,"props":2174,"children":2175},{"class":222,"line":295},[2176],{"type":40,"tag":220,"props":2177,"children":2178},{},[2179],{"type":46,"value":292},{"type":40,"tag":220,"props":2181,"children":2182},{"class":222,"line":304},[2183],{"type":40,"tag":220,"props":2184,"children":2185},{},[2186],{"type":46,"value":2187},"    \u003CAppDesignerFolder>Properties\u003C\u002FAppDesignerFolder>\n",{"type":40,"tag":220,"props":2189,"children":2190},{"class":222,"line":313},[2191],{"type":40,"tag":220,"props":2192,"children":2193},{},[2194],{"type":46,"value":301},{"type":40,"tag":220,"props":2196,"children":2197},{"class":222,"line":322},[2198],{"type":40,"tag":220,"props":2199,"children":2200},{},[2201],{"type":46,"value":310},{"type":40,"tag":220,"props":2203,"children":2204},{"class":222,"line":331},[2205],{"type":40,"tag":220,"props":2206,"children":2207},{},[2208],{"type":46,"value":319},{"type":40,"tag":220,"props":2210,"children":2211},{"class":222,"line":340},[2212],{"type":40,"tag":220,"props":2213,"children":2214},{},[2215],{"type":46,"value":328},{"type":40,"tag":220,"props":2217,"children":2218},{"class":222,"line":349},[2219],{"type":40,"tag":220,"props":2220,"children":2221},{},[2222],{"type":46,"value":337},{"type":40,"tag":220,"props":2224,"children":2225},{"class":222,"line":358},[2226],{"type":40,"tag":220,"props":2227,"children":2228},{},[2229],{"type":46,"value":346},{"type":40,"tag":220,"props":2231,"children":2232},{"class":222,"line":367},[2233],{"type":40,"tag":220,"props":2234,"children":2235},{},[2236],{"type":46,"value":2237},"  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n",{"type":40,"tag":220,"props":2239,"children":2240},{"class":222,"line":1647},[2241],{"type":40,"tag":220,"props":2242,"children":2243},{},[2244],{"type":46,"value":2245},"    \u003CDebugSymbols>true\u003C\u002FDebugSymbols>\n",{"type":40,"tag":220,"props":2247,"children":2248},{"class":222,"line":1656},[2249],{"type":40,"tag":220,"props":2250,"children":2251},{},[2252],{"type":46,"value":2253},"    \u003CDebugType>full\u003C\u002FDebugType>\n",{"type":40,"tag":220,"props":2255,"children":2256},{"class":222,"line":1665},[2257],{"type":40,"tag":220,"props":2258,"children":2259},{},[2260],{"type":46,"value":2261},"    \u003COptimize>false\u003C\u002FOptimize>\n",{"type":40,"tag":220,"props":2263,"children":2264},{"class":222,"line":1674},[2265],{"type":40,"tag":220,"props":2266,"children":2267},{},[2268],{"type":46,"value":2269},"    \u003COutputPath>bin\\Debug\\\u003C\u002FOutputPath>\n",{"type":40,"tag":220,"props":2271,"children":2272},{"class":222,"line":1683},[2273],{"type":40,"tag":220,"props":2274,"children":2275},{},[2276],{"type":46,"value":2277},"    \u003CDefineConstants>DEBUG;TRACE\u003C\u002FDefineConstants>\n",{"type":40,"tag":220,"props":2279,"children":2280},{"class":222,"line":1692},[2281],{"type":40,"tag":220,"props":2282,"children":2283},{},[2284],{"type":46,"value":2285},"    \u003CErrorReport>prompt\u003C\u002FErrorReport>\n",{"type":40,"tag":220,"props":2287,"children":2288},{"class":222,"line":1701},[2289],{"type":40,"tag":220,"props":2290,"children":2291},{},[2292],{"type":46,"value":2293},"    \u003CWarningLevel>4\u003C\u002FWarningLevel>\n",{"type":40,"tag":220,"props":2295,"children":2296},{"class":222,"line":1710},[2297],{"type":40,"tag":220,"props":2298,"children":2299},{},[2300],{"type":46,"value":346},{"type":40,"tag":220,"props":2302,"children":2303},{"class":222,"line":1719},[2304],{"type":40,"tag":220,"props":2305,"children":2306},{},[2307],{"type":46,"value":2308},"  \u003CPropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n",{"type":40,"tag":220,"props":2310,"children":2311},{"class":222,"line":1727},[2312],{"type":40,"tag":220,"props":2313,"children":2314},{},[2315],{"type":46,"value":2316},"    \u003CDebugType>pdbonly\u003C\u002FDebugType>\n",{"type":40,"tag":220,"props":2318,"children":2319},{"class":222,"line":1736},[2320],{"type":40,"tag":220,"props":2321,"children":2322},{},[2323],{"type":46,"value":2324},"    \u003COptimize>true\u003C\u002FOptimize>\n",{"type":40,"tag":220,"props":2326,"children":2327},{"class":222,"line":1745},[2328],{"type":40,"tag":220,"props":2329,"children":2330},{},[2331],{"type":46,"value":2332},"    \u003COutputPath>bin\\Release\\\u003C\u002FOutputPath>\n",{"type":40,"tag":220,"props":2334,"children":2335},{"class":222,"line":1754},[2336],{"type":40,"tag":220,"props":2337,"children":2338},{},[2339],{"type":46,"value":2340},"    \u003CDefineConstants>TRACE\u003C\u002FDefineConstants>\n",{"type":40,"tag":220,"props":2342,"children":2343},{"class":222,"line":1763},[2344],{"type":40,"tag":220,"props":2345,"children":2346},{},[2347],{"type":46,"value":2285},{"type":40,"tag":220,"props":2349,"children":2350},{"class":222,"line":1772},[2351],{"type":40,"tag":220,"props":2352,"children":2353},{},[2354],{"type":46,"value":2293},{"type":40,"tag":220,"props":2356,"children":2357},{"class":222,"line":1780},[2358],{"type":40,"tag":220,"props":2359,"children":2360},{},[2361],{"type":46,"value":346},{"type":40,"tag":220,"props":2363,"children":2364},{"class":222,"line":1788},[2365],{"type":40,"tag":220,"props":2366,"children":2367},{},[2368],{"type":46,"value":2369},"  \u003CItemGroup>\n",{"type":40,"tag":220,"props":2371,"children":2372},{"class":222,"line":1796},[2373],{"type":40,"tag":220,"props":2374,"children":2375},{},[2376],{"type":46,"value":2377},"    \u003CReference Include=\"System\" \u002F>\n",{"type":40,"tag":220,"props":2379,"children":2380},{"class":222,"line":1804},[2381],{"type":40,"tag":220,"props":2382,"children":2383},{},[2384],{"type":46,"value":2385},"    \u003CReference Include=\"System.Core\" \u002F>\n",{"type":40,"tag":220,"props":2387,"children":2388},{"class":222,"line":1813},[2389],{"type":40,"tag":220,"props":2390,"children":2391},{},[2392],{"type":46,"value":2393},"    \u003CReference Include=\"System.Xml.Linq\" \u002F>\n",{"type":40,"tag":220,"props":2395,"children":2396},{"class":222,"line":1821},[2397],{"type":40,"tag":220,"props":2398,"children":2399},{},[2400],{"type":46,"value":2401},"    \u003CReference Include=\"Microsoft.CSharp\" \u002F>\n",{"type":40,"tag":220,"props":2403,"children":2404},{"class":222,"line":1830},[2405],{"type":40,"tag":220,"props":2406,"children":2407},{},[2408],{"type":46,"value":2409},"  \u003C\u002FItemGroup>\n",{"type":40,"tag":220,"props":2411,"children":2412},{"class":222,"line":1839},[2413],{"type":40,"tag":220,"props":2414,"children":2415},{},[2416],{"type":46,"value":2369},{"type":40,"tag":220,"props":2418,"children":2419},{"class":222,"line":1848},[2420],{"type":40,"tag":220,"props":2421,"children":2422},{},[2423],{"type":46,"value":2424},"    \u003CCompile Include=\"Models\\User.cs\" \u002F>\n",{"type":40,"tag":220,"props":2426,"children":2427},{"class":222,"line":1857},[2428],{"type":40,"tag":220,"props":2429,"children":2430},{},[2431],{"type":46,"value":2432},"    \u003CCompile Include=\"Models\\Order.cs\" \u002F>\n",{"type":40,"tag":220,"props":2434,"children":2435},{"class":222,"line":1866},[2436],{"type":40,"tag":220,"props":2437,"children":2438},{},[2439],{"type":46,"value":2440},"    \u003CCompile Include=\"Services\\UserService.cs\" \u002F>\n",{"type":40,"tag":220,"props":2442,"children":2443},{"class":222,"line":1875},[2444],{"type":40,"tag":220,"props":2445,"children":2446},{},[2447],{"type":46,"value":2448},"    \u003CCompile Include=\"Services\\OrderService.cs\" \u002F>\n",{"type":40,"tag":220,"props":2450,"children":2451},{"class":222,"line":1883},[2452],{"type":40,"tag":220,"props":2453,"children":2454},{},[2455],{"type":46,"value":2456},"    \u003CCompile Include=\"Helpers\\StringExtensions.cs\" \u002F>\n",{"type":40,"tag":220,"props":2458,"children":2459},{"class":222,"line":1891},[2460],{"type":40,"tag":220,"props":2461,"children":2462},{},[2463],{"type":46,"value":2464},"    \u003CCompile Include=\"Properties\\AssemblyInfo.cs\" \u002F>\n",{"type":40,"tag":220,"props":2466,"children":2467},{"class":222,"line":1900},[2468],{"type":40,"tag":220,"props":2469,"children":2470},{},[2471],{"type":46,"value":2409},{"type":40,"tag":220,"props":2473,"children":2474},{"class":222,"line":1909},[2475],{"type":40,"tag":220,"props":2476,"children":2477},{},[2478],{"type":46,"value":2369},{"type":40,"tag":220,"props":2480,"children":2481},{"class":222,"line":1917},[2482],{"type":40,"tag":220,"props":2483,"children":2484},{},[2485],{"type":46,"value":2486},"    \u003CNone Include=\"packages.config\" \u002F>\n",{"type":40,"tag":220,"props":2488,"children":2489},{"class":222,"line":1926},[2490],{"type":40,"tag":220,"props":2491,"children":2492},{},[2493],{"type":46,"value":2409},{"type":40,"tag":220,"props":2495,"children":2497},{"class":222,"line":2496},51,[2498],{"type":40,"tag":220,"props":2499,"children":2500},{},[2501],{"type":46,"value":364},{"type":40,"tag":220,"props":2503,"children":2505},{"class":222,"line":2504},52,[2506],{"type":40,"tag":220,"props":2507,"children":2508},{},[2509],{"type":46,"value":373},{"type":40,"tag":56,"props":2511,"children":2512},{},[2513,2517],{"type":40,"tag":60,"props":2514,"children":2515},{},[2516],{"type":46,"value":1136},{"type":46,"value":2518}," (SDK-style — 11 lines):",{"type":40,"tag":209,"props":2520,"children":2522},{"className":211,"code":2521,"language":213,"meta":214,"style":214},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net472\u003C\u002FTargetFramework>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n    \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n",[2523],{"type":40,"tag":74,"props":2524,"children":2525},{"__ignoreMap":214},[2526,2533,2540,2547,2554,2561,2569,2577,2584],{"type":40,"tag":220,"props":2527,"children":2528},{"class":222,"line":223},[2529],{"type":40,"tag":220,"props":2530,"children":2531},{},[2532],{"type":46,"value":396},{"type":40,"tag":220,"props":2534,"children":2535},{"class":222,"line":232},[2536],{"type":40,"tag":220,"props":2537,"children":2538},{},[2539],{"type":46,"value":265},{"type":40,"tag":220,"props":2541,"children":2542},{"class":222,"line":241},[2543],{"type":40,"tag":220,"props":2544,"children":2545},{},[2546],{"type":46,"value":411},{"type":40,"tag":220,"props":2548,"children":2549},{"class":222,"line":250},[2550],{"type":40,"tag":220,"props":2551,"children":2552},{},[2553],{"type":46,"value":346},{"type":40,"tag":220,"props":2555,"children":2556},{"class":222,"line":259},[2557],{"type":40,"tag":220,"props":2558,"children":2559},{},[2560],{"type":46,"value":2369},{"type":40,"tag":220,"props":2562,"children":2563},{"class":222,"line":268},[2564],{"type":40,"tag":220,"props":2565,"children":2566},{},[2567],{"type":46,"value":2568},"    \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n",{"type":40,"tag":220,"props":2570,"children":2571},{"class":222,"line":277},[2572],{"type":40,"tag":220,"props":2573,"children":2574},{},[2575],{"type":46,"value":2576},"    \u003CPackageReference Include=\"Serilog\" Version=\"3.1.1\" \u002F>\n",{"type":40,"tag":220,"props":2578,"children":2579},{"class":222,"line":286},[2580],{"type":40,"tag":220,"props":2581,"children":2582},{},[2583],{"type":46,"value":2409},{"type":40,"tag":220,"props":2585,"children":2586},{"class":222,"line":295},[2587],{"type":40,"tag":220,"props":2588,"children":2589},{},[2590],{"type":46,"value":373},{"type":40,"tag":49,"props":2592,"children":2594},{"id":2593},"common-migration-issues",[2595],{"type":46,"value":2596},"Common Migration Issues",{"type":40,"tag":56,"props":2598,"children":2599},{},[2600,2605],{"type":40,"tag":60,"props":2601,"children":2602},{},[2603],{"type":46,"value":2604},"Embedded resources:",{"type":46,"value":2606}," files not in a standard location may need explicit includes:",{"type":40,"tag":209,"props":2608,"children":2610},{"className":211,"code":2609,"language":213,"meta":214,"style":214},"\u003CItemGroup>\n  \u003CEmbeddedResource Include=\"..\\shared\\Schemas\\*.xsd\" LinkBase=\"Schemas\" \u002F>\n\u003C\u002FItemGroup>\n",[2611],{"type":40,"tag":74,"props":2612,"children":2613},{"__ignoreMap":214},[2614,2621,2629],{"type":40,"tag":220,"props":2615,"children":2616},{"class":222,"line":223},[2617],{"type":40,"tag":220,"props":2618,"children":2619},{},[2620],{"type":46,"value":830},{"type":40,"tag":220,"props":2622,"children":2623},{"class":222,"line":232},[2624],{"type":40,"tag":220,"props":2625,"children":2626},{},[2627],{"type":46,"value":2628},"  \u003CEmbeddedResource Include=\"..\\shared\\Schemas\\*.xsd\" LinkBase=\"Schemas\" \u002F>\n",{"type":40,"tag":220,"props":2630,"children":2631},{"class":222,"line":241},[2632],{"type":40,"tag":220,"props":2633,"children":2634},{},[2635],{"type":46,"value":894},{"type":40,"tag":56,"props":2637,"children":2638},{},[2639,2644],{"type":40,"tag":60,"props":2640,"children":2641},{},[2642],{"type":46,"value":2643},"Content files with CopyToOutputDirectory:",{"type":46,"value":2645}," these still need explicit entries:",{"type":40,"tag":209,"props":2647,"children":2649},{"className":211,"code":2648,"language":213,"meta":214,"style":214},"\u003CItemGroup>\n  \u003CContent Include=\"appsettings.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n  \u003CNone Include=\"scripts\\*.sql\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n\u003C\u002FItemGroup>\n",[2650],{"type":40,"tag":74,"props":2651,"children":2652},{"__ignoreMap":214},[2653,2660,2668,2676],{"type":40,"tag":220,"props":2654,"children":2655},{"class":222,"line":223},[2656],{"type":40,"tag":220,"props":2657,"children":2658},{},[2659],{"type":46,"value":830},{"type":40,"tag":220,"props":2661,"children":2662},{"class":222,"line":232},[2663],{"type":40,"tag":220,"props":2664,"children":2665},{},[2666],{"type":46,"value":2667},"  \u003CContent Include=\"appsettings.json\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n",{"type":40,"tag":220,"props":2669,"children":2670},{"class":222,"line":241},[2671],{"type":40,"tag":220,"props":2672,"children":2673},{},[2674],{"type":46,"value":2675},"  \u003CNone Include=\"scripts\\*.sql\" CopyToOutputDirectory=\"PreserveNewest\" \u002F>\n",{"type":40,"tag":220,"props":2677,"children":2678},{"class":222,"line":250},[2679],{"type":40,"tag":220,"props":2680,"children":2681},{},[2682],{"type":46,"value":894},{"type":40,"tag":56,"props":2684,"children":2685},{},[2686,2691],{"type":40,"tag":60,"props":2687,"children":2688},{},[2689],{"type":46,"value":2690},"Multi-targeting:",{"type":46,"value":2692}," change the element name from singular to plural:",{"type":40,"tag":209,"props":2694,"children":2696},{"className":211,"code":2695,"language":213,"meta":214,"style":214},"\u003C!-- Single target -->\n\u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n\n\u003C!-- Multiple targets -->\n\u003CTargetFrameworks>net472;net8.0\u003C\u002FTargetFrameworks>\n",[2697],{"type":40,"tag":74,"props":2698,"children":2699},{"__ignoreMap":214},[2700,2708,2716,2723,2731],{"type":40,"tag":220,"props":2701,"children":2702},{"class":222,"line":223},[2703],{"type":40,"tag":220,"props":2704,"children":2705},{},[2706],{"type":46,"value":2707},"\u003C!-- Single target -->\n",{"type":40,"tag":220,"props":2709,"children":2710},{"class":222,"line":232},[2711],{"type":40,"tag":220,"props":2712,"children":2713},{},[2714],{"type":46,"value":2715},"\u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n",{"type":40,"tag":220,"props":2717,"children":2718},{"class":222,"line":241},[2719],{"type":40,"tag":220,"props":2720,"children":2721},{"emptyLinePlaceholder":1053},[2722],{"type":46,"value":1056},{"type":40,"tag":220,"props":2724,"children":2725},{"class":222,"line":250},[2726],{"type":40,"tag":220,"props":2727,"children":2728},{},[2729],{"type":46,"value":2730},"\u003C!-- Multiple targets -->\n",{"type":40,"tag":220,"props":2732,"children":2733},{"class":222,"line":259},[2734],{"type":40,"tag":220,"props":2735,"children":2736},{},[2737],{"type":46,"value":2738},"\u003CTargetFrameworks>net472;net8.0\u003C\u002FTargetFrameworks>\n",{"type":40,"tag":56,"props":2740,"children":2741},{},[2742,2747],{"type":40,"tag":60,"props":2743,"children":2744},{},[2745],{"type":46,"value":2746},"WPF\u002FWinForms projects:",{"type":46,"value":2748}," use the appropriate SDK or properties:",{"type":40,"tag":209,"props":2750,"children":2752},{"className":211,"code":2751,"language":213,"meta":214,"style":214},"\u003C!-- Option A: WindowsDesktop SDK -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n\u003C!-- Option B: properties in standard SDK (preferred for .NET 5+) -->\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CUseWPF>true\u003C\u002FUseWPF>\n    \u003C!-- or -->\n    \u003CUseWindowsForms>true\u003C\u002FUseWindowsForms>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n",[2753],{"type":40,"tag":74,"props":2754,"children":2755},{"__ignoreMap":214},[2756,2764,2772,2779,2787,2794,2801,2809,2817,2825,2832],{"type":40,"tag":220,"props":2757,"children":2758},{"class":222,"line":223},[2759],{"type":40,"tag":220,"props":2760,"children":2761},{},[2762],{"type":46,"value":2763},"\u003C!-- Option A: WindowsDesktop SDK -->\n",{"type":40,"tag":220,"props":2765,"children":2766},{"class":222,"line":232},[2767],{"type":40,"tag":220,"props":2768,"children":2769},{},[2770],{"type":46,"value":2771},"\u003CProject Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n",{"type":40,"tag":220,"props":2773,"children":2774},{"class":222,"line":241},[2775],{"type":40,"tag":220,"props":2776,"children":2777},{"emptyLinePlaceholder":1053},[2778],{"type":46,"value":1056},{"type":40,"tag":220,"props":2780,"children":2781},{"class":222,"line":250},[2782],{"type":40,"tag":220,"props":2783,"children":2784},{},[2785],{"type":46,"value":2786},"\u003C!-- Option B: properties in standard SDK (preferred for .NET 5+) -->\n",{"type":40,"tag":220,"props":2788,"children":2789},{"class":222,"line":259},[2790],{"type":40,"tag":220,"props":2791,"children":2792},{},[2793],{"type":46,"value":396},{"type":40,"tag":220,"props":2795,"children":2796},{"class":222,"line":268},[2797],{"type":40,"tag":220,"props":2798,"children":2799},{},[2800],{"type":46,"value":265},{"type":40,"tag":220,"props":2802,"children":2803},{"class":222,"line":277},[2804],{"type":40,"tag":220,"props":2805,"children":2806},{},[2807],{"type":46,"value":2808},"    \u003CUseWPF>true\u003C\u002FUseWPF>\n",{"type":40,"tag":220,"props":2810,"children":2811},{"class":222,"line":286},[2812],{"type":40,"tag":220,"props":2813,"children":2814},{},[2815],{"type":46,"value":2816},"    \u003C!-- or -->\n",{"type":40,"tag":220,"props":2818,"children":2819},{"class":222,"line":295},[2820],{"type":40,"tag":220,"props":2821,"children":2822},{},[2823],{"type":46,"value":2824},"    \u003CUseWindowsForms>true\u003C\u002FUseWindowsForms>\n",{"type":40,"tag":220,"props":2826,"children":2827},{"class":222,"line":304},[2828],{"type":40,"tag":220,"props":2829,"children":2830},{},[2831],{"type":46,"value":346},{"type":40,"tag":220,"props":2833,"children":2834},{"class":222,"line":313},[2835],{"type":40,"tag":220,"props":2836,"children":2837},{},[2838],{"type":46,"value":373},{"type":40,"tag":56,"props":2840,"children":2841},{},[2842,2847],{"type":40,"tag":60,"props":2843,"children":2844},{},[2845],{"type":46,"value":2846},"Test projects:",{"type":46,"value":2848}," use the standard SDK with test framework packages:",{"type":40,"tag":209,"props":2850,"children":2852},{"className":211,"code":2851,"language":213,"meta":214,"style":214},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n    \u003CIsPackable>false\u003C\u002FIsPackable>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.9.0\" \u002F>\n    \u003CPackageReference Include=\"xunit\" Version=\"2.7.0\" \u002F>\n    \u003CPackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.5.7\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n",[2853],{"type":40,"tag":74,"props":2854,"children":2855},{"__ignoreMap":214},[2856,2863,2870,2878,2886,2893,2900,2908,2916,2924,2931],{"type":40,"tag":220,"props":2857,"children":2858},{"class":222,"line":223},[2859],{"type":40,"tag":220,"props":2860,"children":2861},{},[2862],{"type":46,"value":396},{"type":40,"tag":220,"props":2864,"children":2865},{"class":222,"line":232},[2866],{"type":40,"tag":220,"props":2867,"children":2868},{},[2869],{"type":46,"value":265},{"type":40,"tag":220,"props":2871,"children":2872},{"class":222,"line":241},[2873],{"type":40,"tag":220,"props":2874,"children":2875},{},[2876],{"type":46,"value":2877},"    \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n",{"type":40,"tag":220,"props":2879,"children":2880},{"class":222,"line":250},[2881],{"type":40,"tag":220,"props":2882,"children":2883},{},[2884],{"type":46,"value":2885},"    \u003CIsPackable>false\u003C\u002FIsPackable>\n",{"type":40,"tag":220,"props":2887,"children":2888},{"class":222,"line":259},[2889],{"type":40,"tag":220,"props":2890,"children":2891},{},[2892],{"type":46,"value":346},{"type":40,"tag":220,"props":2894,"children":2895},{"class":222,"line":268},[2896],{"type":40,"tag":220,"props":2897,"children":2898},{},[2899],{"type":46,"value":2369},{"type":40,"tag":220,"props":2901,"children":2902},{"class":222,"line":277},[2903],{"type":40,"tag":220,"props":2904,"children":2905},{},[2906],{"type":46,"value":2907},"    \u003CPackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.9.0\" \u002F>\n",{"type":40,"tag":220,"props":2909,"children":2910},{"class":222,"line":286},[2911],{"type":40,"tag":220,"props":2912,"children":2913},{},[2914],{"type":46,"value":2915},"    \u003CPackageReference Include=\"xunit\" Version=\"2.7.0\" \u002F>\n",{"type":40,"tag":220,"props":2917,"children":2918},{"class":222,"line":295},[2919],{"type":40,"tag":220,"props":2920,"children":2921},{},[2922],{"type":46,"value":2923},"    \u003CPackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.5.7\" \u002F>\n",{"type":40,"tag":220,"props":2925,"children":2926},{"class":222,"line":304},[2927],{"type":40,"tag":220,"props":2928,"children":2929},{},[2930],{"type":46,"value":2409},{"type":40,"tag":220,"props":2932,"children":2933},{"class":222,"line":313},[2934],{"type":40,"tag":220,"props":2935,"children":2936},{},[2937],{"type":46,"value":373},{"type":40,"tag":49,"props":2939,"children":2941},{"id":2940},"central-package-management-migration",[2942],{"type":46,"value":2943},"Central Package Management Migration",{"type":40,"tag":56,"props":2945,"children":2946},{},[2947,2949,2957],{"type":46,"value":2948},"Centralizes NuGet version management across a multi-project solution. See ",{"type":40,"tag":2950,"props":2951,"children":2955},"a",{"href":2952,"rel":2953},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fnuget\u002Fconsume-packages\u002Fcentral-package-management",[2954],"nofollow",[2956],{"type":46,"value":2952},{"type":46,"value":2958}," for details.",{"type":40,"tag":56,"props":2960,"children":2961},{},[2962,2967,2969,2975,2977,2983,2984,2990],{"type":40,"tag":60,"props":2963,"children":2964},{},[2965],{"type":46,"value":2966},"Step 1:",{"type":46,"value":2968}," Create ",{"type":40,"tag":74,"props":2970,"children":2972},{"className":2971},[],[2973],{"type":46,"value":2974},"Directory.Packages.props",{"type":46,"value":2976}," at the repository root with ",{"type":40,"tag":74,"props":2978,"children":2980},{"className":2979},[],[2981],{"type":46,"value":2982},"\u003CManagePackageVersionsCentrally>true\u003C\u002FManagePackageVersionsCentrally>",{"type":46,"value":952},{"type":40,"tag":74,"props":2985,"children":2987},{"className":2986},[],[2988],{"type":46,"value":2989},"\u003CPackageVersion>",{"type":46,"value":2991}," items for all packages.",{"type":40,"tag":56,"props":2993,"children":2994},{},[2995,3000,3002,3008,3010,3016],{"type":40,"tag":60,"props":2996,"children":2997},{},[2998],{"type":46,"value":2999},"Step 2:",{"type":46,"value":3001}," Remove ",{"type":40,"tag":74,"props":3003,"children":3005},{"className":3004},[],[3006],{"type":46,"value":3007},"Version",{"type":46,"value":3009}," from each project's ",{"type":40,"tag":74,"props":3011,"children":3013},{"className":3012},[],[3014],{"type":46,"value":3015},"PackageReference",{"type":46,"value":3017},":",{"type":40,"tag":209,"props":3019,"children":3021},{"className":211,"code":3020,"language":213,"meta":214,"style":214},"\u003C!-- BEFORE -->\n\u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n\n\u003C!-- AFTER -->\n\u003CPackageReference Include=\"Newtonsoft.Json\" \u002F>\n",[3022],{"type":40,"tag":74,"props":3023,"children":3024},{"__ignoreMap":214},[3025,3033,3041,3048,3056],{"type":40,"tag":220,"props":3026,"children":3027},{"class":222,"line":223},[3028],{"type":40,"tag":220,"props":3029,"children":3030},{},[3031],{"type":46,"value":3032},"\u003C!-- BEFORE -->\n",{"type":40,"tag":220,"props":3034,"children":3035},{"class":222,"line":232},[3036],{"type":40,"tag":220,"props":3037,"children":3038},{},[3039],{"type":46,"value":3040},"\u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n",{"type":40,"tag":220,"props":3042,"children":3043},{"class":222,"line":241},[3044],{"type":40,"tag":220,"props":3045,"children":3046},{"emptyLinePlaceholder":1053},[3047],{"type":46,"value":1056},{"type":40,"tag":220,"props":3049,"children":3050},{"class":222,"line":250},[3051],{"type":40,"tag":220,"props":3052,"children":3053},{},[3054],{"type":46,"value":3055},"\u003C!-- AFTER -->\n",{"type":40,"tag":220,"props":3057,"children":3058},{"class":222,"line":259},[3059],{"type":40,"tag":220,"props":3060,"children":3061},{},[3062],{"type":46,"value":3063},"\u003CPackageReference Include=\"Newtonsoft.Json\" \u002F>\n",{"type":40,"tag":49,"props":3065,"children":3067},{"id":3066},"directorybuild-consolidation",[3068],{"type":46,"value":3069},"Directory.Build Consolidation",{"type":40,"tag":56,"props":3071,"children":3072},{},[3073,3075,3080],{"type":46,"value":3074},"Identify properties repeated across multiple ",{"type":40,"tag":74,"props":3076,"children":3078},{"className":3077},[],[3079],{"type":46,"value":205},{"type":46,"value":3081}," files and move them to shared files.",{"type":40,"tag":56,"props":3083,"children":3084},{},[3085,3094],{"type":40,"tag":60,"props":3086,"children":3087},{},[3088],{"type":40,"tag":74,"props":3089,"children":3091},{"className":3090},[],[3092],{"type":46,"value":3093},"Directory.Build.props",{"type":46,"value":3095}," (for properties — placed at repo or src root):",{"type":40,"tag":209,"props":3097,"children":3099},{"className":211,"code":3098,"language":213,"meta":214,"style":214},"\u003CProject>\n  \u003CPropertyGroup>\n    \u003CTargetFramework>net8.0\u003C\u002FTargetFramework>\n    \u003CNullable>enable\u003C\u002FNullable>\n    \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n    \u003CTreatWarningsAsErrors>true\u003C\u002FTreatWarningsAsErrors>\n    \u003CCompany>Contoso\u003C\u002FCompany>\n    \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n  \u003C\u002FPropertyGroup>\n\u003C\u002FProject>\n",[3100],{"type":40,"tag":74,"props":3101,"children":3102},{"__ignoreMap":214},[3103,3111,3118,3125,3133,3141,3149,3157,3165,3172],{"type":40,"tag":220,"props":3104,"children":3105},{"class":222,"line":223},[3106],{"type":40,"tag":220,"props":3107,"children":3108},{},[3109],{"type":46,"value":3110},"\u003CProject>\n",{"type":40,"tag":220,"props":3112,"children":3113},{"class":222,"line":232},[3114],{"type":40,"tag":220,"props":3115,"children":3116},{},[3117],{"type":46,"value":265},{"type":40,"tag":220,"props":3119,"children":3120},{"class":222,"line":241},[3121],{"type":40,"tag":220,"props":3122,"children":3123},{},[3124],{"type":46,"value":2877},{"type":40,"tag":220,"props":3126,"children":3127},{"class":222,"line":250},[3128],{"type":40,"tag":220,"props":3129,"children":3130},{},[3131],{"type":46,"value":3132},"    \u003CNullable>enable\u003C\u002FNullable>\n",{"type":40,"tag":220,"props":3134,"children":3135},{"class":222,"line":259},[3136],{"type":40,"tag":220,"props":3137,"children":3138},{},[3139],{"type":46,"value":3140},"    \u003CImplicitUsings>enable\u003C\u002FImplicitUsings>\n",{"type":40,"tag":220,"props":3142,"children":3143},{"class":222,"line":268},[3144],{"type":40,"tag":220,"props":3145,"children":3146},{},[3147],{"type":46,"value":3148},"    \u003CTreatWarningsAsErrors>true\u003C\u002FTreatWarningsAsErrors>\n",{"type":40,"tag":220,"props":3150,"children":3151},{"class":222,"line":277},[3152],{"type":40,"tag":220,"props":3153,"children":3154},{},[3155],{"type":46,"value":3156},"    \u003CCompany>Contoso\u003C\u002FCompany>\n",{"type":40,"tag":220,"props":3158,"children":3159},{"class":222,"line":286},[3160],{"type":40,"tag":220,"props":3161,"children":3162},{},[3163],{"type":46,"value":3164},"    \u003CCopyright>Copyright © Contoso 2024\u003C\u002FCopyright>\n",{"type":40,"tag":220,"props":3166,"children":3167},{"class":222,"line":295},[3168],{"type":40,"tag":220,"props":3169,"children":3170},{},[3171],{"type":46,"value":346},{"type":40,"tag":220,"props":3173,"children":3174},{"class":222,"line":304},[3175],{"type":40,"tag":220,"props":3176,"children":3177},{},[3178],{"type":46,"value":373},{"type":40,"tag":56,"props":3180,"children":3181},{},[3182,3191],{"type":40,"tag":60,"props":3183,"children":3184},{},[3185],{"type":40,"tag":74,"props":3186,"children":3188},{"className":3187},[],[3189],{"type":46,"value":3190},"Directory.Build.targets",{"type":46,"value":3192}," (for targets\u002Ftasks — placed at repo or src root):",{"type":40,"tag":209,"props":3194,"children":3196},{"className":211,"code":3195,"language":213,"meta":214,"style":214},"\u003CProject>\n  \u003CTarget Name=\"PrintBuildInfo\" AfterTargets=\"Build\">\n    \u003CMessage Importance=\"High\" Text=\"Built $(AssemblyName) → $(TargetPath)\" \u002F>\n  \u003C\u002FTarget>\n\u003C\u002FProject>\n",[3197],{"type":40,"tag":74,"props":3198,"children":3199},{"__ignoreMap":214},[3200,3207,3215,3223,3231],{"type":40,"tag":220,"props":3201,"children":3202},{"class":222,"line":223},[3203],{"type":40,"tag":220,"props":3204,"children":3205},{},[3206],{"type":46,"value":3110},{"type":40,"tag":220,"props":3208,"children":3209},{"class":222,"line":232},[3210],{"type":40,"tag":220,"props":3211,"children":3212},{},[3213],{"type":46,"value":3214},"  \u003CTarget Name=\"PrintBuildInfo\" AfterTargets=\"Build\">\n",{"type":40,"tag":220,"props":3216,"children":3217},{"class":222,"line":241},[3218],{"type":40,"tag":220,"props":3219,"children":3220},{},[3221],{"type":46,"value":3222},"    \u003CMessage Importance=\"High\" Text=\"Built $(AssemblyName) → $(TargetPath)\" \u002F>\n",{"type":40,"tag":220,"props":3224,"children":3225},{"class":222,"line":250},[3226],{"type":40,"tag":220,"props":3227,"children":3228},{},[3229],{"type":46,"value":3230},"  \u003C\u002FTarget>\n",{"type":40,"tag":220,"props":3232,"children":3233},{"class":222,"line":259},[3234],{"type":40,"tag":220,"props":3235,"children":3236},{},[3237],{"type":46,"value":373},{"type":40,"tag":56,"props":3239,"children":3240},{},[3241,3253],{"type":40,"tag":60,"props":3242,"children":3243},{},[3244,3246,3251],{"type":46,"value":3245},"Keep in individual ",{"type":40,"tag":74,"props":3247,"children":3249},{"className":3248},[],[3250],{"type":46,"value":205},{"type":46,"value":3252}," files",{"type":46,"value":3254}," only what is project-specific:",{"type":40,"tag":209,"props":3256,"children":3258},{"className":211,"code":3257,"language":213,"meta":214,"style":214},"\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003COutputType>Exe\u003C\u002FOutputType>\n    \u003CAssemblyName>MyApp\u003C\u002FAssemblyName>\n  \u003C\u002FPropertyGroup>\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Serilog\" \u002F>\n    \u003CProjectReference Include=\"..\\MyLibrary\\MyLibrary.csproj\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n",[3259],{"type":40,"tag":74,"props":3260,"children":3261},{"__ignoreMap":214},[3262,3269,3276,3284,3292,3299,3306,3314,3322,3329],{"type":40,"tag":220,"props":3263,"children":3264},{"class":222,"line":223},[3265],{"type":40,"tag":220,"props":3266,"children":3267},{},[3268],{"type":46,"value":396},{"type":40,"tag":220,"props":3270,"children":3271},{"class":222,"line":232},[3272],{"type":40,"tag":220,"props":3273,"children":3274},{},[3275],{"type":46,"value":265},{"type":40,"tag":220,"props":3277,"children":3278},{"class":222,"line":241},[3279],{"type":40,"tag":220,"props":3280,"children":3281},{},[3282],{"type":46,"value":3283},"    \u003COutputType>Exe\u003C\u002FOutputType>\n",{"type":40,"tag":220,"props":3285,"children":3286},{"class":222,"line":250},[3287],{"type":40,"tag":220,"props":3288,"children":3289},{},[3290],{"type":46,"value":3291},"    \u003CAssemblyName>MyApp\u003C\u002FAssemblyName>\n",{"type":40,"tag":220,"props":3293,"children":3294},{"class":222,"line":259},[3295],{"type":40,"tag":220,"props":3296,"children":3297},{},[3298],{"type":46,"value":346},{"type":40,"tag":220,"props":3300,"children":3301},{"class":222,"line":268},[3302],{"type":40,"tag":220,"props":3303,"children":3304},{},[3305],{"type":46,"value":2369},{"type":40,"tag":220,"props":3307,"children":3308},{"class":222,"line":277},[3309],{"type":40,"tag":220,"props":3310,"children":3311},{},[3312],{"type":46,"value":3313},"    \u003CPackageReference Include=\"Serilog\" \u002F>\n",{"type":40,"tag":220,"props":3315,"children":3316},{"class":222,"line":286},[3317],{"type":40,"tag":220,"props":3318,"children":3319},{},[3320],{"type":46,"value":3321},"    \u003CProjectReference Include=\"..\\MyLibrary\\MyLibrary.csproj\" \u002F>\n",{"type":40,"tag":220,"props":3323,"children":3324},{"class":222,"line":295},[3325],{"type":40,"tag":220,"props":3326,"children":3327},{},[3328],{"type":46,"value":2409},{"type":40,"tag":220,"props":3330,"children":3331},{"class":222,"line":304},[3332],{"type":40,"tag":220,"props":3333,"children":3334},{},[3335],{"type":46,"value":373},{"type":40,"tag":49,"props":3337,"children":3339},{"id":3338},"tools-and-automation",[3340],{"type":46,"value":3341},"Tools and Automation",{"type":40,"tag":667,"props":3343,"children":3344},{},[3345,3361],{"type":40,"tag":671,"props":3346,"children":3347},{},[3348],{"type":40,"tag":675,"props":3349,"children":3350},{},[3351,3356],{"type":40,"tag":679,"props":3352,"children":3353},{},[3354],{"type":46,"value":3355},"Tool",{"type":40,"tag":679,"props":3357,"children":3358},{},[3359],{"type":46,"value":3360},"Usage",{"type":40,"tag":702,"props":3362,"children":3363},{},[3364,3387,3406,3429],{"type":40,"tag":675,"props":3365,"children":3366},{},[3367,3376],{"type":40,"tag":709,"props":3368,"children":3369},{},[3370],{"type":40,"tag":74,"props":3371,"children":3373},{"className":3372},[],[3374],{"type":46,"value":3375},"dotnet try-convert",{"type":40,"tag":709,"props":3377,"children":3378},{},[3379,3381],{"type":46,"value":3380},"Automated legacy-to-SDK conversion. Install: ",{"type":40,"tag":74,"props":3382,"children":3384},{"className":3383},[],[3385],{"type":46,"value":3386},"dotnet tool install -g try-convert",{"type":40,"tag":675,"props":3388,"children":3389},{},[3390,3395],{"type":40,"tag":709,"props":3391,"children":3392},{},[3393],{"type":46,"value":3394},".NET Upgrade Assistant",{"type":40,"tag":709,"props":3396,"children":3397},{},[3398,3400],{"type":46,"value":3399},"Full migration including API changes. Install: ",{"type":40,"tag":74,"props":3401,"children":3403},{"className":3402},[],[3404],{"type":46,"value":3405},"dotnet tool install -g upgrade-assistant",{"type":40,"tag":675,"props":3407,"children":3408},{},[3409,3414],{"type":40,"tag":709,"props":3410,"children":3411},{},[3412],{"type":46,"value":3413},"Visual Studio",{"type":40,"tag":709,"props":3415,"children":3416},{},[3417,3419,3424,3425],{"type":46,"value":3418},"Right-click ",{"type":40,"tag":74,"props":3420,"children":3422},{"className":3421},[],[3423],{"type":46,"value":128},{"type":46,"value":1444},{"type":40,"tag":1446,"props":3426,"children":3427},{},[3428],{"type":46,"value":1450},{"type":40,"tag":675,"props":3430,"children":3431},{},[3432,3437],{"type":40,"tag":709,"props":3433,"children":3434},{},[3435],{"type":46,"value":3436},"Manual migration",{"type":40,"tag":709,"props":3438,"children":3439},{},[3440],{"type":46,"value":3441},"Often cleanest for simple projects — follow the checklist above",{"type":40,"tag":56,"props":3443,"children":3444},{},[3445],{"type":40,"tag":60,"props":3446,"children":3447},{},[3448],{"type":46,"value":3449},"Recommended approach:",{"type":40,"tag":3451,"props":3452,"children":3453},"ol",{},[3454,3467,3472,3477,3482],{"type":40,"tag":70,"props":3455,"children":3456},{},[3457,3459,3465],{"type":46,"value":3458},"Run ",{"type":40,"tag":74,"props":3460,"children":3462},{"className":3461},[],[3463],{"type":46,"value":3464},"try-convert",{"type":46,"value":3466}," for a first pass",{"type":40,"tag":70,"props":3468,"children":3469},{},[3470],{"type":46,"value":3471},"Review and clean up the output manually",{"type":40,"tag":70,"props":3473,"children":3474},{},[3475],{"type":46,"value":3476},"Build and fix any issues",{"type":40,"tag":70,"props":3478,"children":3479},{},[3480],{"type":46,"value":3481},"Enable modern features (nullable, implicit usings)",{"type":40,"tag":70,"props":3483,"children":3484},{},[3485,3487],{"type":46,"value":3486},"Consolidate shared settings into ",{"type":40,"tag":74,"props":3488,"children":3490},{"className":3489},[],[3491],{"type":46,"value":3093},{"type":40,"tag":3493,"props":3494,"children":3495},"style",{},[3496],{"type":46,"value":3497},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3499,"total":3607},[3500,3517,3532,3550,3564,3583,3593],{"slug":3501,"name":3501,"fn":3502,"description":3503,"org":3504,"tags":3505,"stars":22,"repoUrl":23,"updatedAt":3516},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3506,3507,3510,3513],{"name":17,"slug":18,"type":15},{"name":3508,"slug":3509,"type":15},"Code Analysis","code-analysis",{"name":3511,"slug":3512,"type":15},"Debugging","debugging",{"name":3514,"slug":3515,"type":15},"Performance","performance","2026-07-12T08:23:25.400375",{"slug":3518,"name":3518,"fn":3519,"description":3520,"org":3521,"tags":3522,"stars":22,"repoUrl":23,"updatedAt":3531},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3523,3524,3527,3528],{"name":17,"slug":18,"type":15},{"name":3525,"slug":3526,"type":15},"Android","android",{"name":3511,"slug":3512,"type":15},{"name":3529,"slug":3530,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3533,"name":3533,"fn":3534,"description":3535,"org":3536,"tags":3537,"stars":22,"repoUrl":23,"updatedAt":3549},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3538,3539,3540,3543,3546],{"name":17,"slug":18,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3541,"slug":3542,"type":15},"iOS","ios",{"name":3544,"slug":3545,"type":15},"macOS","macos",{"name":3547,"slug":3548,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3551,"name":3551,"fn":3552,"description":3553,"org":3554,"tags":3555,"stars":22,"repoUrl":23,"updatedAt":3563},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3556,3557,3560],{"name":3508,"slug":3509,"type":15},{"name":3558,"slug":3559,"type":15},"QA","qa",{"name":3561,"slug":3562,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":3565,"name":3565,"fn":3566,"description":3567,"org":3568,"tags":3569,"stars":22,"repoUrl":23,"updatedAt":3582},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3570,3571,3574,3576,3579],{"name":17,"slug":18,"type":15},{"name":3572,"slug":3573,"type":15},"Blazor","blazor",{"name":3575,"slug":1027,"type":15},"C#",{"name":3577,"slug":3578,"type":15},"UI Components","ui-components",{"name":3580,"slug":3581,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":3584,"name":3584,"fn":3585,"description":3586,"org":3587,"tags":3588,"stars":22,"repoUrl":23,"updatedAt":3592},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3589,3590,3591],{"name":3508,"slug":3509,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3529,"slug":3530,"type":15},"2026-07-12T08:21:34.637923",{"slug":3594,"name":3594,"fn":3595,"description":3596,"org":3597,"tags":3598,"stars":22,"repoUrl":23,"updatedAt":3606},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3599,3602,3603],{"name":3600,"slug":3601,"type":15},"Build","build",{"name":3511,"slug":3512,"type":15},{"name":3604,"slug":3605,"type":15},"Engineering","engineering","2026-07-19T05:38:19.340791",96,{"items":3609,"total":3714},[3610,3622,3629,3636,3644,3650,3658,3664,3670,3680,3693,3704],{"slug":3611,"name":3611,"fn":3612,"description":3613,"org":3614,"tags":3615,"stars":3619,"repoUrl":3620,"updatedAt":3621},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3616,3617,3618],{"name":17,"slug":18,"type":15},{"name":3604,"slug":3605,"type":15},{"name":3514,"slug":3515,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3501,"name":3501,"fn":3502,"description":3503,"org":3623,"tags":3624,"stars":22,"repoUrl":23,"updatedAt":3516},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3625,3626,3627,3628],{"name":17,"slug":18,"type":15},{"name":3508,"slug":3509,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3514,"slug":3515,"type":15},{"slug":3518,"name":3518,"fn":3519,"description":3520,"org":3630,"tags":3631,"stars":22,"repoUrl":23,"updatedAt":3531},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3632,3633,3634,3635],{"name":17,"slug":18,"type":15},{"name":3525,"slug":3526,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3529,"slug":3530,"type":15},{"slug":3533,"name":3533,"fn":3534,"description":3535,"org":3637,"tags":3638,"stars":22,"repoUrl":23,"updatedAt":3549},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3639,3640,3641,3642,3643],{"name":17,"slug":18,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3541,"slug":3542,"type":15},{"name":3544,"slug":3545,"type":15},{"name":3547,"slug":3548,"type":15},{"slug":3551,"name":3551,"fn":3552,"description":3553,"org":3645,"tags":3646,"stars":22,"repoUrl":23,"updatedAt":3563},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3647,3648,3649],{"name":3508,"slug":3509,"type":15},{"name":3558,"slug":3559,"type":15},{"name":3561,"slug":3562,"type":15},{"slug":3565,"name":3565,"fn":3566,"description":3567,"org":3651,"tags":3652,"stars":22,"repoUrl":23,"updatedAt":3582},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3653,3654,3655,3656,3657],{"name":17,"slug":18,"type":15},{"name":3572,"slug":3573,"type":15},{"name":3575,"slug":1027,"type":15},{"name":3577,"slug":3578,"type":15},{"name":3580,"slug":3581,"type":15},{"slug":3584,"name":3584,"fn":3585,"description":3586,"org":3659,"tags":3660,"stars":22,"repoUrl":23,"updatedAt":3592},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3661,3662,3663],{"name":3508,"slug":3509,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3529,"slug":3530,"type":15},{"slug":3594,"name":3594,"fn":3595,"description":3596,"org":3665,"tags":3666,"stars":22,"repoUrl":23,"updatedAt":3606},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3667,3668,3669],{"name":3600,"slug":3601,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3604,"slug":3605,"type":15},{"slug":3671,"name":3671,"fn":3672,"description":3673,"org":3674,"tags":3675,"stars":22,"repoUrl":23,"updatedAt":3679},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3676,3677,3678],{"name":17,"slug":18,"type":15},{"name":3604,"slug":3605,"type":15},{"name":3514,"slug":3515,"type":15},"2026-07-19T05:38:18.364937",{"slug":3681,"name":3681,"fn":3682,"description":3683,"org":3684,"tags":3685,"stars":22,"repoUrl":23,"updatedAt":3692},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3686,3687,3690,3691],{"name":3604,"slug":3605,"type":15},{"name":3688,"slug":3689,"type":15},"Monitoring","monitoring",{"name":3514,"slug":3515,"type":15},{"name":3561,"slug":3562,"type":15},"2026-07-12T08:21:35.865649",{"slug":3694,"name":3694,"fn":3695,"description":3696,"org":3697,"tags":3698,"stars":22,"repoUrl":23,"updatedAt":3703},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3699,3700,3701,3702],{"name":17,"slug":18,"type":15},{"name":3511,"slug":3512,"type":15},{"name":3604,"slug":3605,"type":15},{"name":3514,"slug":3515,"type":15},"2026-07-12T08:21:40.961722",{"slug":3705,"name":3705,"fn":3706,"description":3707,"org":3708,"tags":3709,"stars":22,"repoUrl":23,"updatedAt":3713},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3710,3711,3712],{"name":3511,"slug":3512,"type":15},{"name":3604,"slug":3605,"type":15},{"name":3558,"slug":3559,"type":15},"2026-07-19T05:38:14.336279",144]