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.75k stars 1.07k forks source link

[.NET 8 Regression] error CS1504: Source file "<Path to XAML>" could not be opened --- Could not find file #34438

Open WardenGnaw opened 1 year ago

WardenGnaw commented 1 year ago

Describe the bug

A .NET project fails to build with the .NET 8 SDK but succeeds with the .NET 7 SDK. It seems to be an issue with the WPF generated source files not being able to find the original XAML file.

To Reproduce

  1. Have .NET 8 SDK 8.0.100-preview.6.23330.14
  2. Checkout https://github.com/microsoft/MIEngine/tree/main
  3. Run dotnet build src\MIDebugEngine.sln
  4. See error logs
    Errors Logs
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(49,18): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(57,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(65,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(73,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(81,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(89,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(97,19): error CS1504: Source file 'UI\Containe
rPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2gao
z2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(105,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(113,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(121,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(129,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(137,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(145,19): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(166,21): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]
C:\src\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs(246,23): error CS1504: Source file 'UI\Contain
erPickerDialogWindow.xaml' could not be opened -- Could not find file. [C:\src\MIEngine\src\SSHDebugPS\SSHDebugPS_zh2ga
oz2_wpftmp.csproj]

Note: The build works if you use a .NET 7 SDK like dotnet "C:\Program Files\dotnet\sdk\7.0.109\dotnet.dll" build src\MIDebugEngine

Exceptions (if any)

None. This is just dotnet build

Further technical details

.NET SDK:
 Version:   8.0.100-preview.6.23330.14
 Commit:    ba97796b8f

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.22621
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\8.0.100-preview.6.23330.14\

.NET workloads installed:
There are no installed workloads to display.

Host:
  Version:      8.0.0-preview.6.23329.7
  Architecture: x64
  Commit:       5340be2ccc

.NET SDKs installed:
  7.0.200 [C:\Program Files\dotnet\sdk]
  7.0.306 [C:\Program Files\dotnet\sdk]
  8.0.100-preview.3.23178.7 [C:\Program Files\dotnet\sdk]
  8.0.100-preview.6.23330.14 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 8.0.0-preview.3.23177.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 8.0.0-preview.6.23329.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.0-preview.3.23174.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 8.0.0-preview.6.23329.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.19 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.8 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 7.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.0-preview.3.23178.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 8.0.0-preview.6.23329.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

WardenGnaw commented 1 year ago

@chuckries Helped point out that this may be an issue caused with the project overriding the <IntermediateOutputPath>

<IntermediateOutputPath>$(MIEngineRoot)obj\$(Configuration)\$(MSBuildProjectName)\</IntermediateOutputPath>

https://github.com/microsoft/MIEngine/blob/3986396d9c31c6ac729c6b52fa79f34d7a253e95/build/all_projects.settings.targets#L22

KirillOsenkov commented 1 year ago

Just ran into this as well, ping me on Teams if you need a repro.

miloush commented 1 year ago

Works in 8.0.100-preview.3.23178.7

abpiskunov commented 1 year ago

Still repros with 8.0.100-rc.1.23463.5. We do override IntermediateOutputPath however not doing anything crazy, just group all projects obj folder under common obj folder in the root. Each project stil has its own subfolder under common obj.

dsplaisted commented 1 year ago

I've investigated this and found a workaround, which is to set the EmbedUntrackedSources property to false.

@tmat This is a regression in .NET 8 that looks like it's related to Source Link embedding untracked files, can you take a look?

I compared a build of the project between the .NET 7 and the .NET 8 SDK. In the .NET 8 SDK where it fails, there are EmbeddedFiles items passed to the compiler in the inner XAML markup compilation pass 2 build, that are not present in the .NET 7 SDK:

EmbeddedFiles
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs
        Link = ContainerPickerDialogWindow.g.cs
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\GeneratedInternalTypeHelper.g.cs
        Link = GeneratedInternalTypeHelper.g.cs
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\GeneratedAssemblyInfo
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs

These appear to be causing, or te be related to, the error that is being generated.

tmat commented 1 year ago

This is an old bug in nuget/wpf interaction: https://github.com/dotnet/wpf/issues/1718 IncludePackageReferencesDuringMarkupCompilation = true is required for the fix to kick in. MIEngine repo sets this property to false in src\SSHDebugPS\SSHDebugPS.csproj which causes the build failure.

tmat commented 1 year ago

@KirillOsenkov Is property IncludePackageReferencesDuringMarkupCompilation set to false in your repro project?

KirillOsenkov commented 1 year ago

It doesn't appear to be set or mentioned at all.

@dsplaisted I don't have the broken SDK on this machine anymore, so if you could try setting IncludePackageReferencesDuringMarkupCompilation = true and see if it builds successfully?

KirillOsenkov commented 1 year ago

I notice that this is present for .NET Core WinFX targets: https://github.com/dotnet/wpf/blob/b9b48871d457fc1f78fa9526c0570dae8e34b488/src/Microsoft.DotNet.Wpf/src/PresentationBuildTasks/Microsoft.WinFX.targets#L453

But not for desktop: image

nagilson commented 1 year ago

I've investigated this and found a workaround, which is to set the EmbedUntrackedSources property to false.

@tmat This is a regression in .NET 8 that looks like it's related to Source Link embedding untracked files, can you take a look?

I compared a build of the project between the .NET 7 and the .NET 8 SDK. In the .NET 8 SDK where it fails, there are EmbeddedFiles items passed to the compiler in the inner XAML markup compilation pass 2 build, that are not present in the .NET 7 SDK:

EmbeddedFiles
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\UI\ContainerPickerDialogWindow.g.cs
        Link = ContainerPickerDialogWindow.g.cs
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\GeneratedInternalTypeHelper.g.cs
        Link = GeneratedInternalTypeHelper.g.cs
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\GeneratedAssemblyInfo
    c:\Users\noahgilson\MIEngine\obj\Debug\SSHDebugPS\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs

These appear to be causing, or te be related to, the error that is being generated.

Thank you @dsplaisted for investigating. I could not figure out what was wrong from the binlog.

@abpiskunov Does setting IncludePackageReferencesDuringMarkupCompilation=true solve the problem for your 3 repos? NVM. I saw the email thread, looks like its working for you.

And @tmat thanks for following up, is there a reason this may not have surfaced for customers in .NET 7 but would begin to surface in .NET 8? If so, we should create a breaking change doc.

tmat commented 1 year ago

is there a reason this may not have surfaced for customers in .NET 7 but would begin to surface in .NET 8

Yes, we enabled Source Link by default in NET 8.

tmat commented 1 year ago

we should create a breaking change doc.

+1

KirillOsenkov commented 1 year ago

Let’s also create a minimal repro .csproj for easier validation. Thoughts on what the right fix should be here?

rainersigwald commented 1 year ago

We don't really want EmbedUntrackedSources=false for the whole project though, right? We'd ideally like it only for the $(IsWpfTempProject) project, right? That sounds like a change that could be placed in dotnet/wpf.

KirillOsenkov commented 1 year ago

The problem though is that it's desktop WPF that is broken, would it be fixed by changes to dotnet/wpf?

miloush commented 1 year ago

/cc @pchaurasia14 FYI

baronfel commented 1 year ago

@tmat would you like to drive that breaking change docs issue, or should I go ahead and get that started?

tmat commented 1 year ago

Please, get it started if you don't mind.

pchaurasia14 commented 1 year ago

Just checking in here - Is there any action item for WPF regarding exposing the $(IsWpfTempProject) property?

KirillOsenkov commented 1 year ago

This is very blocking, let's get this fixed please.

KirillOsenkov commented 1 year ago

Are we shipping .NET 8 with this? It's going to basically break all WPF desktop in the world. To me it looks like an absolute shipstopper.

rainersigwald commented 1 year ago

Offline we figured out that there are two ways to get into this situation:

1.Setting <IncludePackageReferencesDuringMarkupCompilation>false</IncludePackageReferencesDuringMarkupCompilation>

  1. Having a .NET Framework-targeting project
    • Using .NET SDK 8
    • Without UseWPF and with manual XAML assembly references
    • With a customized obj/IntermediateOutputPath
    • in a Git repo directory (so that SourceLink logic kicks in)

https://github.com/dotnet/wpf/pull/8378 fixes the former.

sdk344838.zip is a repro of the latter.

singhashish-wpf commented 1 year ago

Workarounds Available: Either of these should work, depending on the use cases.

KirillOsenkov commented 1 year ago

Related: https://github.com/dotnet/wpf/issues/1718

KirillOsenkov commented 1 year ago

Starting to see these in the wild as folks update to .NET 8.

Did we end up having a doc page or an aka.ms links that I can point people to?

KirillOsenkov commented 1 year ago

Related: https://github.com/dotnet/sourcelink/issues/492

KirillOsenkov commented 1 year ago

Related: https://github.com/dotnet/wpf/issues/366

bouchraRekhadda commented 1 year ago

Offline we figured out that there are two ways to get into this situation:

1.Setting <IncludePackageReferencesDuringMarkupCompilation>false</IncludePackageReferencesDuringMarkupCompilation> 2. Having a .NET Framework-targeting project

  • Using .NET SDK 8
  • Without UseWPF and with manual XAML assembly references
  • With a customized obj/IntermediateOutputPath

dotnet/wpf#8378 fixes the former.

sdk344838.zip is a repro of the latter.

We are in second use case, targeting .NET Framework 4.7.1 while using .NET SDK 8 and redirecting to a costume IntermediateOutputPath. For now we are obliged to rollback to .NET 6, but it seems like there is no workaround for our use case.

singhashish-wpf commented 1 year ago

Starting to see these in the wild as folks update to .NET 8.

Did we end up having a doc page or an aka.ms links that I can point people to?

aka.ms/net8wpfsl This points to the known issues page.

bouchraRekhadda commented 1 year ago

aka.ms/net8wpfsl This points to the known issues page.

@singhashish-wpf the workarounds suggested, i.e. setting IncludePackageReferencesDuringMarkupCompilation to true it submerges the famous error https://github.com/dotnet/wpf/discussions/5700

Error MC3074 The tag 'X' does not exist in XML namespace 'clr-namespace:Y'

Am I looping something ?

singhashish-wpf commented 1 year ago

@bouchraRekhadda EmbedUntrackedSources set as False. Does this workaround not work for you>?

bouchraRekhadda commented 1 year ago

@bouchraRekhadda EmbedUntrackedSources set as False. Does this workaround not work for you>?

Unfortunately no. I still have the same error MC3074.

singhashish-wpf commented 1 year ago

@bouchraRekhadda EmbedUntrackedSources set as False. Does this workaround not work for you>?

Unfortunately no. I still have the same error MC3074.

Can you share a minimal repro? And the versions of SDKs you are using?

singhashish-wpf commented 1 year ago

The 2nd case reproduces for me on .NET6, .NET7, .NET8 as well, Most probably I am missing something here. I heard that this is a regression in .NET8. cc:// @KirillOsenkov @rainersigwald

  1. Having a .NET Framework-targeting project
  • Using .NET SDK 8
  • Without UseWPF and with manual XAML assembly references
  • With a customized obj/IntermediateOutputPath

Attaching binlogs.zip binlogs.

KirillOsenkov commented 1 year ago

Hi Ashish, make sure to comment out the line 21 in MainWindow.xaml.cs: C:\Users\singhashish\Downloads\sdk344838\FxWpf\MainWindow.xaml.cs(21,10)

If you see in Rainer's repro, it is commented out: https://github.com/dotnet/sdk/issues/34438#issuecomment-1787679715 https://github.com/dotnet/sdk/files/13219712/sdk344838.zip

KirillOsenkov commented 1 year ago

Oh, and after you unzip the repro, make sure to run git init in the folder and add the source files and make a commit. This way the SourceLink logic kicks in which breaks:

image

singhashish-wpf commented 1 year ago

Thanks @KirillOsenkov for the repro steps. I was able to repro. While checking I see that the MarkupCompilePass1 and MarkupCompilePass2 targets are executing successfully. The problem happens in the CoreCompile part later for the main project(Not the temporary target assembly). Also this change would be in NETFX as i understand, While the change shouldn't be in GenerateTemporaryTargetAssembly in my understanding, but there is a lot of code diff in NETFX and NetCore versions of the file.

From what I understand, this is happening as the EmbedUntrackedSources is set as True for the main project by default and we need some mechanism to make it false for such kind of projects(IntermediateOutputPath + Reference Desktop WPF libs). Not quite sure on where that change would be, @rainersigwald Any thoughts?

otac0n commented 1 year ago

I feel like this is a security issue. This will potentially disclose comments customers did not intend to disclose.

vikukush commented 1 year ago

This is what I'm using to workaround:

  <!-- Another XAML hack for .NET Core SDK version 8 -->
  <Target Name="NETCoreSDKHack" BeforeTargets="MarkupCompilePass1" Condition="'@(Page)'!=''">
    <Message Text="Copying @(Page) to output to workaround NET SDK bug https://github.com/dotnet/sdk/issues/34438" Importance="high" />
    <Copy SourceFiles="@(Page)" DestinationFolder="$(IntermediateOutputPath)" />
  </Target>