แก้ไข

แชร์ผ่าน


Default RID used when targeting .NET Framework

In .NET 8, a change was introduced to use a smaller runtime identifier (RID) graph when targeting net8.0 and later versions.

However, this broke customers who multi-target .NET and .NET Framework. That's because the restore happens once, but the .NET Framework project tries to use the old RID default and the .NET (Core) project tries to use the new reduced RID graph.

To enable this multi-targeting scenario, a default RID that's compatible with the new RID graph is now used in this scenario.

Version introduced

.NET 9 GA

Previous behavior

SDK-style projects that targeted .NET Framework with no RID set defaulted to win7-x86 or win7-x64.

New behavior

SDK-style projects that target .NET Framework with no RID set default to win-x86 or win-x64.

Type of breaking change

This change can affect source compatibility.

Reason for change

.NET Framework applications were getting a default RID that was incompatible with the portable RID graph. That incompatibility resulted in a restore error:

Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(266,5): error NETSDK1047: Assets file 'D:\1\s\artifacts\obj\MSBuild\project.assets.json' doesn't have a target for 'net472/win7-x64'. Ensure that restore has run and that you have included 'net472' in the TargetFrameworks for your project. You may also need to include 'win7-x64' in your project's RuntimeIdentifiers. [MSBuild.csproj::TargetFramework=net472]>

For more information, see dotnet/sdk issue #35575.

If you're affected by this change, choose one of the following actions:

  • Update your runtime identifier to a value supported by the portable RID graph. Project file example:

    <PropertyGroup>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    </PropertyGroup>
    

    If you specify the RID as a command-line argument, make a similar change. For example, dotnet publish --runtime win-x64.

  • Switch back to the old RID graph by setting UseRidGraph to true in the project file:

    <PropertyGroup>
      <UseRidGraph>true</UseRidGraph>
    </PropertyGroup>
    

Affected APIs

None.