解决WPF启用隐式全局引用后无法发布为x64程序的问题

在 .NET 6 和更高版本中,C# 引入了一个新功能叫作 "global using directives",它允许我们在一个地方定义全局可用的 using 指令,而不必在每个文件中重复。然而,有时候我们可能希望在某些文件中禁用特定的全局 using 指令。

我在基于 .Net 8 的 WPF 项目中引入了 Prism.Wpf 和 Prism.Unity 组件,它们可能会自动添加自己的全局引用,不过我没有找到全局引用 Prism 库的地方。

此时当项目启用了全局隐式引用后,使用可移植的目标运行时发布 WPF 程序没有问题,但是选择 win-x64 目标运行时发布 WPF 程序就会出现很多和 Prism 命名空间引用相关的类名错误,尤其是在发布独立部署模式的程序时问题尤为明显,因为这时候已经无法选择使用可移植的目标运行时发布了。

当我手动在项目的类中添加 Prism 相关 using 声明后,ReSharper 扩展会提示“Using directive is not required by the code and can be safely removed”,从而在文件中出现警告,这对于具有代码洁癖的我来说是不可忍受的。

网上搜索到一个方法,在项目文件(.csproj)中移除指定的全局引用,如下所示:

<ItemGroup>
  <!-- 移除自动生成的 Prism.Ioc 全局引用 -->
  <Using Remove="Prism.Ioc" />
</ItemGroup>

这种方法看似很有希望能够解决问题,但是它并不起作用,在生成后的 GlobalUsings 文件(obj\debug\ProjectName.GlobalUsings.g.cs)中仍然包含 global using global::Prism.Ioc;

这时候可以考虑将项目的隐式全局引用禁用,手动添加默认的全局引用,如下所示:

复制代码
<PropertyGroup>
  ...
  <ImplicitUsings>disable</ImplicitUsings>
  ...
</PropertyGroup>

<!-- 手动添加全局引用 -->
<ItemGroup>
  <Using Include="System" />
  <Using Include="System.Collections.Generic" />
  <Using Include="System.Linq" />
  <Using Include="System.Threading" />
  <Using Include="System.Threading.Tasks" />
</ItemGroup>
复制代码

此时在项目文件中添加对应 Prism 相关 using 声明后,可以顺利发布 win-x64 目标运行时的 WPF 程序了。

关于全局隐式引用的问题是暂时解决了,但是遗憾的是,目前为止 Prism 自动添加全局隐式引用的原理还没有弄清楚。

posted @   xhubobo  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2021-02-19 ASP.Net Core Web API中的IActionFilter总结
点击右上角即可分享
微信分享提示