本文记录在 dotnet 6 时通过禁用 IncludePackageReferencesDuringMarkupCompilation 解决源代码冲突问题时,在 dotnet 9 将因此导致 XAML 构建生成的 g.cs 文件包含的 XAML 只记录相对文件路径,从而导致构建不通过
在 WPF 修复 dotnet 6 与源代码包冲突 这篇博客里面和大家介绍通过禁用 IncludePackageReferencesDuringMarkupCompilation 解决源代码冲突问题
以下是在 dotnet 6 里的构建失败信息
通过禁用 IncludePackageReferencesDuringMarkupCompilation 即可解决,代码如下
更改之后的 csproj 代码如下
依然是上述代码不变,升级到 dotnet 9 的 SDK 之后,将会让代码构建不通过。假定源代码包里面包含了 MyControl.xaml 文件,那么构建过程提示错误内容大概如下
进入到 obj 文件夹下,去看 MyControl.g.cs 文件,可以看到开始的 #pragma checksum
记录的就是错误的相对路径
预期的情况下,此时的记录应该是一个正确的相对路径或绝对路径,如下面代码所示才是正确的
解决方法只有是开启 IncludePackageReferencesDuringMarkupCompilation 功能,即只需注释掉 <IncludePackageReferencesDuringMarkupCompilation>False</IncludePackageReferencesDuringMarkupCompilation>
即可
当然了,注释掉 IncludePackageReferencesDuringMarkupCompilation 的禁用,则又会出现源代码兼容问题。不过现在是 dotnet 9 了,是时候更新源代码包啦
以上代码为常写的判断代码,但在使用以上代码之前,还请确保源代码包已经更新
禁用 IncludePackageReferencesDuringMarkupCompilation 导致构建时 #pragma checksum
记录错误的路径,这个问题不单只是在引用源代码包的时候能够出现,也能够在跨项目引用 xaml 时复现
禁用 IncludePackageReferencesDuringMarkupCompilation 功能,将会导致在跨项目引用 xaml 文件,将 xaml 文件作为链接方式添加时,构建过程中出现 error CS1504 错误
禁用 IncludePackageReferencesDuringMarkupCompilation 功能之后,从 xaml 生成的 g.cs 文件里的 #pragma checksum
将记录错误的相对文件路径,进而导致构建失败。最简单的复现方式如下:
- 创建两个 wpf 项目,其中一个为 WPF 库项目,一个为 WPF 应用项目
- 在 WPF 库项目里面添加名为 MyUserControl 的用户控件
- 在 WPF 应用项目里面通过以下代码引用 MyUserControl.xaml 和 MyUserControl.xaml.cs 文件
如果此时同样在 WPF 应用项目里设置禁用 IncludePackageReferencesDuringMarkupCompilation 功能,则构建时将会提示 obj\Debug\net9.0-windows\MyUserControl.g.cs(59,21,59,41): error CS1504: 无法打开源文件“MyUserControl.xaml”-- 无法找到文件
错误。以下是设置禁用 IncludePackageReferencesDuringMarkupCompilation 功能的 WPF 应用项目的 csproj 项目文件的代码
以上代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码
获取代码之后,进入 WPFDemo/TestIncludePackageReferencesDuringMarkupCompilation 文件夹,即可获取到源代码
大家可以尝试拉取项目代码跑跑看。 此问题已经和 WPF 官方报告,详细请看 https://github.com/dotnet/wpf/issues/10093
更多技术博客,请参阅 博客导航
原文链接: http://blog.lindexi.com/post/dotnet-9-WPF-%E9%A1%B9%E7%9B%AE%E7%A6%81%E7%94%A8-IncludePackageReferencesDuringMarkupCompilation-%E5%AF%BC%E8%87%B4%E6%BA%90%E4%BB%A3%E7%A0%81%E5%8C%85-XAML-%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。