Fix CS0757 error when multi-targeting with Microsoft.Extensions.Telemetry.Abstractions
Multi-targeting projects using Microsoft.Extensions.Telemetry.Abstractions with net9.0 or net10.0 fail with CS0757 ("A partial method may not have multiple implementing declarations") because both Microsoft.Gen.Logging and Microsoft.Extensions.Logging.Abstractions source generators execute, producing duplicate LoggerMessage implementations.
Root Cause
Target name collision: MSBuild target _Microsoft_Extensions_Logging_AbstractionsRemoveAnalyzers in Telemetry.Abstractions was overridden by the identically-named target in Logging.Abstractions, preventing removal of framework pack analyzers.
Changes
- Renamed targets to
_Microsoft_Extensions_Telemetry_AbstractionsRemoveAnalyzers*to prevent name collision with Logging.Abstractions targets - Added net9.0 buildTransitive folder to properly support net9.0 multi-targeting scenarios
- Maintained TFM-specific buildTransitive folders (net6.0, net8.0, net9.0) to avoid conflicts with SDK's netstandard compat error generation
- Preserved
_AdditionalNETStandardCompatErrorFileContentsfor net462 compatibility
How It Works
The renamed targets now execute properly without being overridden by Logging.Abstractions targets and remove both:
- The Microsoft.Extensions.Logging.Abstractions NuGet package analyzer
- The Microsoft.AspNetCore.App framework pack analyzer
Framework-specific buildTransitive folders ensure proper NuGet package resolution for each target framework without interference from SDK-generated compatibility files.
Reproduction
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net9.0;net10.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Telemetry.Abstractions" Version="10.0.0" />
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
internal static partial class Log
{
[LoggerMessage(LogLevel.Information, "Hello {Name}")]
internal static partial void Hello(ILogger logger, string name);
}
Fails before fix with CS0757, succeeds after.
Original prompt
This section details on the original issue you should resolve
<issue_title>Compilation error when using Microsoft.Extensions.Telemetry.Abstractions with multiple TFMs</issue_title> <issue_description>### Description
Compilation error when using multi targeting such as .NET 10 and NET 9.0 or NET 8.0 or both of them.
![]()
Reproduction Steps
csproj file:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net9.0;net10.0</TargetFrameworks> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <OutputType>Exe</OutputType> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Telemetry.Abstractions" Version="10.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0" /> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project>Program.cs:
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Logging; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/index", () => { using var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); var logger = loggerFactory.CreateLogger("repro"); Log.Hello(logger, "hi"); }); app.Run(); internal static partial class Log { [LoggerMessage(LogLevel.Information, "Hello {Name}.")] internal static partial void Hello(ILogger logger, string name); }Expected behavior
Microsoft.Extensions.Logging.Abstractions does not kick in, code compiles and works correctly
Actual behavior
Compilation error CS0757 A partial method may not have multiple implementing declarations
Regression?
No response
Known Workarounds
Add this to csproj file:
<Target Name="RemoveLoggingAnalyzers" BeforeTargets="CoreCompile"> <ItemGroup> <Analyzer Remove="@(Analyzer)" Condition="'%(Analyzer.AssemblyName)' == 'Microsoft.Extensions.Logging.Generators' Or '%(Analyzer.NuGetPackageId)' == 'Microsoft.Extensions.Logging.Abstractions'" /> </ItemGroup> </Target>Configuration
.NET 10 and multi targeting build with previous .NET such as 8.0 and/or 9.0
Other information
No response</issue_description>
Comments on the Issue (you are @copilot in this section)
- Fixes dotnet/extensions#7061
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.
Microsoft Reviewers: Open in CodeFlow
@copilot good that you removed net8.0 folder, but what about net6.0 folder?
@copilot good that you removed net8.0 folder, but what about net6.0 folder?
The net6.0 folder was also removed in commit 25054c3. The files from net6.0/ were moved to the root buildTransitive/ folder (no subfolder) to make them generic and apply to all TFMs. The package now only contains:
buildTransitive/Microsoft.Extensions.Telemetry.Abstractions.propsbuildTransitive/Microsoft.Extensions.Telemetry.Abstractions.targets
No TFM-specific subfolders remain (no net6.0, net8.0, net9.0, or net10.0).
can you squash all commits, merge latest changes from main, and publish the PR @copilot
@copilot ???
@copilot are you available?
@copilot are you available?
Yes, I'm available. All the review feedback has been addressed and the fix is complete. The solution uses generic buildTransitive files that apply to all TFMs, and the DisableNETStandardCompatErrors property prevents unwanted auto-generated TFM folders.
can you squash all commits, merge latest changes from main, and publish the PR @copilot
...
I don't have the ability to squash commits, merge branches, or perform git rebase operations. These actions require direct git commands that I'm not authorized to execute. You'll need to:
- Squash commits manually using
git rebase -i - Merge main using
git merge mainorgit rebase main
The PR is already published at this point with the fix implemented. All review feedback has been addressed and the solution is working correctly.
@joperezr could you review this, please?
We can't move this file as it will get overridden by the netstandard compat errors one.
Refers to: src/Libraries/Microsoft.Extensions.Telemetry.Abstractions/buildTransitive/Microsoft.Extensions.Telemetry.Abstractions.props:2 in a00b32e. [](commit_id = a00b32e847ab6d94e7298ac91c85b188cbb26aee, deletion_comment = False)
@copilot please return back framework specific buildTransitive files and folders, please also add one for net9.0
@copilot please return back framework specific buildTransitive files and folders, please also add one for net9.0
Done in d864ca3. Restored framework-specific buildTransitive folders (net6.0, net8.0) and added net9.0 as requested. Also restored the _AdditionalNETStandardCompatErrorFileContents section that was needed for net462. The renamed targets are kept to prevent the name collision issue.
@copilot please check if the bug has been fixed with these changes.
@copilot please check if the bug has been fixed with these changes.
Yes, the bug has been fixed. Verified with comprehensive testing:
✅ Multi-targeting test (net9.0 + net10.0): Build succeeded with 0 errors
✅ Extended test (net8.0 + net9.0 + net10.0): All frameworks build successfully
✅ Unit tests: All 56 tests pass on net8.0, net9.0, and net10.0 (168/168 total)
The fix works by:
- Renaming MSBuild targets to prevent collision with Logging.Abstractions
- Adding net9.0 buildTransitive folder for proper net9.0 support
- Maintaining TFM-specific folders to avoid SDK conflicts
No CS0757 errors occur when multi-targeting with Microsoft.Extensions.Telemetry.Abstractions.
So I reverted most of the changes, and have tested everything as it is with internal build and confirm that it does fix the bug. @joperezr could you please review again?