Csproj Analyzer & Cleaner
Paste a .csproj file to find duplicate references, redundant SDK-default properties, legacy elements, and XML errors, then copy a cleaned version.
What this tool checks
Paste a .csproj file and this tool parses it with System.Xml.Linq (no external MSBuild or NuGet library) and flags four things: duplicate PackageReference entries (same package listed twice under the same condition — usually a copy-paste accident), properties that already match the SDK's own default (explicitly writing a value the SDK would apply anyway), legacy non-SDK-style elements left over from a pre-2017 project file, and malformed XML with the exact line and column.
Properties this tool considers redundant
Only checked inside unconditional <PropertyGroup> blocks — a property set inside a Condition="..." block is deliberately overriding something for that specific configuration or target framework, so it's never flagged even if its value happens to match the default: OutputType=Library, GenerateAssemblyInfo=true, ImplicitUsings=disable, Nullable=disable, IsPackable=true, GenerateDocumentationFile=false, Deterministic=true, LangVersion=latest. AssemblyName/RootNamespace matching the project file name are only checked if you fill in the optional file name field above — there's no way to know your actual file name from pasted text alone, so this tool doesn't guess it.
Duplicate detection and multi-targeting
A PackageReference is only flagged as a duplicate if another one with the same package ID and the same ItemGroup condition already exists. The same package listed once under Condition="'$(TargetFramework)'=='net8.0'" and again under a different target framework condition is a completely normal multi-targeting pattern, not a duplicate — this tool doesn't flag that.
Worked example
Pasting a .csproj with a duplicated Newtonsoft.Json reference and a redundant <OutputType>Library</OutputType>:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>
flags the duplicate reference and the redundant OutputType, and produces this cleaned output:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>
How to use this tool
- Optionally enter your project's file name to enable the AssemblyName/RootNamespace check.
- Paste your .csproj content.
- Click Analyze (or Ctrl+Enter).
- Review each flagged category, then copy the cleaned .csproj from the output panel.
.csproj content
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>Paste a .csproj file and click Analyze.