如何在 Windows 上创建针对 WPF 的 .NET 核心库?
Posted
技术标签:
【中文标题】如何在 Windows 上创建针对 WPF 的 .NET 核心库?【英文标题】:How to create .NET core lib targeting WPF on Windows? 【发布时间】:2021-09-10 13:47:58 【问题描述】:我的解决方案中有以下项目(简化):
Helpers,一个带有通用帮助方法的 .NET Core 5.0 库 ConsoleApp,一个 .NET Core 5.0 控制台应用程序,它使用 Helpers.lib。 ConsoleApp 必须在 Windows 和 Linux 上运行。 HelpersWpfCore,问题,这应该是一个 .NET Core 5.0 库,它使用 Helpers.lib 并包含一些 WPF 功能,如对打印、文档、用户控件等的支持。 WpfApp,一个 .NET Core 5.0 WPF 应用程序,它必须使用 Helpers.lib 和 HelpersWpfCore.lib。 WpfApp 只需在 Windows 上运行。我的问题是我无法编译 HelpersWpf 库。我收到了类似的错误
Error CS0246: Der Typ- oder Namespacename "IValueConverter" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (15, 31)
Error CS0246: Der Typ- oder Namespacename "BindingMode" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (15, 13)
Error CS0246: Der Typ- oder Namespacename "DependencyProperty" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (14, 95)
Error CS0246: Der Typ- oder Namespacename "FrameworkElement" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (14, 38)
Error CS0234: Der Typ- oder Namespacename "Shapes" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (7, 22)
Error CS0234: Der Typ- oder Namespacename "Data" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (6, 22)
Error CS0234: Der Typ- oder Namespacename "Controls" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (5, 22)
Error CS0246: Der Typ- oder Namespacename "Adorner" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (8, 23)
Error CS0246: Der Typ- oder Namespacename "UIElement" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (8, 54)
Error CS0234: Der Typ- oder Namespacename "Documents" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (2, 22)
Error CS0246: Der Typ- oder Namespacename "DrawingContext" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (10, 42)
Error CS0234: Der Typ- oder Namespacename "Media" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (3, 22)
Error CS0234: Der Typ- oder Namespacename "Documents" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (2, 22)
("wurde nicht gefunden" => "未找到")
在 HelpersWpfCore -> Dependencies -> Frameworks 中仅列出“Microsoft.NETCore.App”。
我怎样才能实现缺失的类将包含在库中?
我知道这是 .NET Core 而不是 .NET Framework(这已经更早了,并且在 4.7.2 中运行良好)。但由于 WPF 核心应用程序只能在 Windows 上运行,我认为这应该是可能的,尤其是在 2021 年和 Core 5.0 中,不是吗?
由于某些情况,使用 Multitargeting 切换回 WpfApp 的 .NET Framework 对我来说不是一个解决方案。
【问题讨论】:
哦,我忘记了:我使用的是 VisualStudio 2019 【参考方案1】:您似乎使用错误的模板创建了项目。
在解决方案资源管理器中双击项目。这将打开项目文件。或者直接打开 .csproj 文件。
通过检查<TargetFramework>
标记,确保您使用的是正确的目标框架名字对象。
.NET 5 是跨平台的。它只支持跨平台库。 Adorner
、UIElement
等是针对包含在 Windows 特定库中的专用类的 Windows(或 WPF)。 (与 UI 相关的库或 WPF 等框架从不跨平台兼容)。
由于您使用的是 Windows 特定资源,因此您必须在配置项目的目标框架时明确指定操作系统。 这当然会删除库的跨平台兼容性。 您可以在Microsoft Docs: .NET 5+ OS-specific TFMs中找到目标框架名字对象列表
因此,正确的目标框架名字对象应该是 net5.0-windows
(这会将缺少的对 Microsoft.WindowsDesktop.App
的引用添加到项目的依赖项中):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
...
</Project>
请注意,要最终启用正确的 SDK(在您的情况下为 WPF),您必须添加相应的 MSBuild 属性(参见上面的示例):
<UseWPF>true</UseWPF>
见Microsoft Docs: MSBuild reference for .NET Desktop SDK projects
【讨论】:
我之前尝试将 TargetFramework 从“net5.0”更改为“net5.0-windows”,但这样做并添加“以上是关于如何在 Windows 上创建针对 WPF 的 .NET 核心库?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows Forms/WPF 中为数据库视图(带连接)创建编辑器?
带有WPF的Aero玻璃框架上类似Windows资源管理器的搜索框