【问题标题】:.Net 5 - WPF, unit test woes.Net 5 - WPF,单元测试问题
【发布时间】:2021-02-24 11:44:42
【问题描述】:

我在玩 .Net 5 时遇到了一些问题,所以我希望有人能对事情有所了解。在大型企业 .Net Framework 解决方案上工作了多年,.Net Core 似乎让我擦肩而过,我没有接触过它,这可能解释了我的一些困惑......

单元测试参考?

我创建了一个解决方案,其中包含一个 WPF 项目(“WPF App (.NET)”)和一个单元测试项目(“MSTest Test project (.Net Core)”)。两者都已在其属性页面中设置为“.NET 5”的目标框架。

当我从单元测试项目中引用 WPF 项目时,项目引用旁边会出现一个黄色三角形,并且错误列表窗口中出现以下错误:

项目“MyTestWpf.csproj”以“net5.0-windows”为目标。它不能被以 '.NETCoreApp,Version=v5.0' 为目标的项目引用

到底如何从 UT 项目中引用 WPF 项目?

引用 WPF 类型的类库?

我还创建了一个 .Net 5 类库,它需要引用各种 WPF 类型(控件等),但我不确定如何配置必要的程序集/框架引用(在框架世界中我会只需将程序集引用添加到 PresentationFramework、System.Xaml 等)。不知何故,通过反复试验,我确实得到了这个工作,在项目文件中使用这些行的组合:-

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<UseWPF>true</UseWPF>

以及将目标框架从“net5.0”更改为“net5.0-windows”。

但是我不确定实际上需要哪种组合,或者我什至应该手动编辑项目文件,如果不能通过 Visual Studio 完成,这感觉就像是倒退了一步!

【问题讨论】:

  • 在 Core 开发的这一阶段,手动编辑项目文件相当普遍,因为 Visual Studio 的 UI 没有跟上 .NET 的快速发展。我知道在 .NET 中托管 WPF 内容需要 UseWPF 设置,并且您的 Sdk 参考看起来是正确的。
  • 如果你的单元测试库引用你的 WPF 项目,单元测试也必须以net5.0-windows为目标。
  • @canton7 成功了。我想我理解为什么 tfm 需要是“net5.0-windows”,因为我猜“net5.0”是跨平台的,所以不会导致任何 Windows 桌面程序集被引用。但是我很想知道 的目的是什么,因为类库项目文件在构建之前需要这个和 tfm。有趣的是,UT 项目仅使用 tfm 构建。
  • 是的,没错。 net5.0-windows 是 net5.0 的超集,可让您访问特定于 windows 的 api。我不确定 UseWpf 做了什么,是否需要引入 WPF 程序集,或者它是否会触发 WPF 需要的一些额外代码生成。

标签: c# .net wpf .net-core .net-5


【解决方案1】:

从 .NET 5.0 开始,为 WPF 和 Windows 窗体创建新项目与 .NET Core 3.0 和 3.1 中的不同。

从 .NET 5.0 及更高版本开始,为 WPF 和 Windows 窗体创建新项目需要具有特定于操作系统的目标框架名称,以及项目文件中支持的语言的 SDK 标头,例如 csproj (C#)、vbproj (VB)、fsproj (F#) 使用与类库和控制台应用程序相同的 SDK 名称对象。

因此,在 .NET 5.0 及更高版本中,您不必为任何使用 WPF 和 Windows 窗体的项目指定 Sdk="Microsoft.NET.Sdk.WindowsDesktop",但必须根据需要明确指定 &lt;UseWPF&gt; 和 &lt;UseWindowsForms&gt;。

例如,这是一个基本的 WinForms 可执行项目:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows7.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

</Project>

对于引用 Windows 窗体的单元测试项目,您可以像以下示例一样更新您的单元测试项目:(注意额外的 &lt;UseWindowsForms&gt;true&lt;/UseWindowsForms&gt; 元素)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <IsPackable>false</IsPackable>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup>
      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
      <PackageReference Include="MSTest.TestAdapter" Version="2.2.4" />
      <PackageReference Include="MSTest.TestFramework" Version="2.2.4" />
      <PackageReference Include="coverlet.collector" Version="1.3.0" />
  </ItemGroup>

</Project>

【讨论】:

    【解决方案2】:

    @canton 在这里确实有正确的答案,但在 cmets 中有点迷失了。澄清一下,默认情况下,您的 UnitTest 项目可能以 net5.0 为目标,它需要以 net5.0-windows 为目标。

    您可以手动修改UnitTest.csproj 文件以进行此更改。

    <PropertyGroup>
        <TargetFramework>net5.0-windows</TargetFramework>
        <IsPackable>false</IsPackable>
    </PropertyGroup>
    

    【讨论】:

      猜你喜欢
      • 2012-04-09
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      相关资源
      最近更新 更多