dotnet / sdk

Core functionality needed to create .NET Core projects, that is shared between Visual Studio and CLI
https://dot.net/core
MIT License
2.71k stars 1.07k forks source link

dotnet watch run or build suddenly started failing with Sdk.Web, > 8.0.206 and Paket. #43468

Open isaacabraham opened 1 month ago

isaacabraham commented 1 month ago

This is related to this issue, around a breaking change somewhere after .NET 8.0.206 that is impacted (as far as I can tell) from the following convergence:

  1. You are using the Microsoft.NET.Sdk.Web SDK.
  2. You are using an SDK later than 8.0.206 (I've used up to 401 and can reliably reproduce this).
  3. You are using Paket as your .NET package management client.

This issue is not confined to F#. It also impacts C# projects.

If all of these things are true and you dotnet watch build or run from the folder of the project, things go wrong. I suspect it's something that's changed since 8.0.206 (or the Sdk.Web) that has somehow broken Paket.

We have seen this with multiple customers of SAFE Stack, which uses Paket and ASP .NET Core - when people upgraded to 8.0.3xx, things started going wrong with no code changes at all.

This repository contains a working reproduction of the issue using F#, whilst this repository contains an even simpler repro of the issue using C#.

Here are some steps to reproduce:

  1. Install a version of .NET 8.0 after 8.0.206 (I'm using 8.0.401).
  2. Make a clean folder and cd to it.
  3. dotnet new globaljson
  4. Set it to e.g.
{
    "sdk": {
        "version": "8.0.401"
    }
}
  1. dotnet new console -lang F#
  2. dotnet tool install paket --create-manifest-if-needed
  3. dotnet paket add FSharp.Core
  4. Change the SDK in the project file.

Now, observe the following behaviours:

dotnet watch build ❌

dotnet watch � Started
  Determining projects to restore...
  Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
  File name: 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
     at System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext)
     at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
     at System.Reflection.Assembly.GetType(String name, Boolean throwOnError)
     at System.StartupHookProvider.CallStartupHook(StartupHookNameOrPath startupHook)
     at System.StartupHookProvider.ProcessStartupHooks()

D:\code\runthru\.paket\Paket.Restore.targets(171,3): error MSB3073: The command "dotnet paket restore" exited with code -532462766. [D:\code\runthru\runthru.fsproj]

Build FAILED.

dotnet watch run

error MSB3073: The command "dotnet paket restore" exited with code -532462766

Workarounds

Observations

cc: @baronfel - he has been unable to reproduce this on his machine at all :-(

dotnet-issue-labeler[bot] commented 1 month ago

I couldn't figure out the best area label to add to this issue. If you have write-permissions please help me learn by adding exactly one area label.

dotnet-issue-labeler[bot] commented 1 month ago

I couldn't figure out the best area label to add to this issue. If you have write-permissions please help me learn by adding exactly one area label.

kevkov commented 2 weeks ago

I was having the same issue with dotnet watch run and I saw the following in Event Viewer:

Application: dotnet.exe
CoreCLR Version: 4.700.22.55902
.NET Core Version: 3.1.32
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.
File name: 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext)
   at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
   at System.Reflection.Assembly.GetType(String name, Boolean throwOnError)
   at System.StartupHookProvider.CallStartupHook(StartupHookNameOrPath startupHook)
   at System.StartupHookProvider.ProcessStartupHooks()

Along with sdk versions 6 and 8, I had sdk 3.1 installed, as part of VS2019, so I uninstalled it (using dotnet-core-uninstall which advised that the uninstall would break VS2019) and now dotnet watch run and dotnet build appear to be working normally with a global.json that specifies sdk 8.0.403.