在 .NET 6.0 类库中使用 Prism.DryIoc 时“目标平台必须设置为 Windows”

Posted

技术标签:

【中文标题】在 .NET 6.0 类库中使用 Prism.DryIoc 时“目标平台必须设置为 Windows”【英文标题】:"The target platform must be set to Windows" when using Prism.DryIoc in .NET 6.0 Class Library 【发布时间】:2022-01-18 18:40:32 【问题描述】:

我正在使用一个类库进行测试,我需要配置 DryIoc,所以我引用了 Nuget 包 Prism.DryIoc。请注意,我正在开发 Xamarin 解决方案,并且没有(或不需要)任何 WPF(或其他 Windows)组件。

当我的类库设置为 .NET Core 3.1 时,它可以正确编译。但是,如果我将其更改为 .NET 5.0 或 .NET 6.0,则会收到此错误:

Error NETSDK1136 目标平台必须设置为Windows(通常 通过在 TargetFramework 属性中包含“-windows”)使用时 Windows 窗体或 WPF,或引用这样做的项目或包。 C:\程序 Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.Shared.targets 250

当我查看来自 Prism.DryIoc 的引用时,我发现它引用了 Prism.Wpf。

有没有人知道一种方法来完成删除任何 Wpf 依赖项,这样我就可以直接使用 .NET 6.0 编译我的库而不会出现问题并且不必将 Windows 指定为目标框架?

重现步骤:

    打开 Visual Studio 2022 创建一个面向 .NET 6.0 的类库类型的新项目 将 Nuget 引用添加到最新的 Prism.DryIoc(目前为 8.1.97) 重建(有时需要第二次重建才能看到错误)

附上示例类库。

【问题讨论】:

你的目标是什么? .net 5 或 6 是否有一些要求,或者这仅仅是想要使用最新的 .net?即使您找到了解决方案,您也无法在 X-Forms 项目中引用 .net5+ 库。注意:.NET Standard 2.0 Xamarin Forms 应用程序在 .net5 或 6 运行时运行良好 - 最新的 .net 向后兼容 - 所以使用 .net6 的唯一原因是您需要一些新的 API。在这种情况下,您将不得不等待 MAUI 的发布。 主要代码位于 .Net Standard 2.1 库中。我在这里遇到的问题是在一个测试库中,并且测试库必须有一个运行时,即 .net framework 4.x、.net core 或 .net 5/6。他们没有在 Xamarin 本身上运行的任何代码,但使用相同的 DryIoc 注册。为了运行测试,例如在 Azure Devops 中,他们不得使用任何类型的 Windows 组件。 【参考方案1】:

Xamarin Forms 使用 .Net Standard 2.0 或 2.1 库。它与 .Net Core 或 .Net 5-6 项目不兼容,直到 2022 年迁移到 Maui 之后才会兼容。届时它将使用 .Net 5 作为标准。

【讨论】:

主要代码位于 .Net Standard 2.1 库中。我在这里遇到的问题是在一个测试库中,并且测试库必须有一个运行时,即 .net framework 4.x、.net core 或 .net 5/6。他们没有在 Xamarin 本身上运行的任何代码,但使用相同的 DryIoc 注册。为了运行测试,例如在 Azure Devops 中,他们不得使用任何类型的 Windows 组件。 Xamarin 团队决定不必将 Xamarin.Forms 5 移植到 .net6 github.com/xamarin/Xamarin.Forms/issues/14829 但我认为您的解释在技术上并不正确。 Net6.0 是netstandard 2.1 的超集,所以代码应该是可运行的。我认为问题出在 xamarin 或 xamarin.forms 的构建脚本中。【参考方案2】:

对于将来来到这里的任何人:与任何 Xamarin 应用程序一起使用的正确包是 Prism.DryIoc.Forms(而不是 Prism.DryIoc),如 here 所述。

我的项目使用 Prism.DryIoc 来创建一个 DryIoc 引导程序,该引导程序继承自 Wpf 项目中的 PrismBootstrapperBase。我通过从 PrismBootstrapperBase 中提取所需的代码并删除对 Prism.DryIoc 的引用解决了这个问题。这是引导程序的代码供参考:

public class TestsBootstrapper

    #region Properties
    IContainerExtension _containerExtension;
    public IContainerProvider Container => _containerExtension;
    #endregion

    #region Run
    public void Run()
    
        ContainerLocator.SetContainerExtension(CreateContainerExtension);
        this._containerExtension = ContainerLocator.Current;
        RegisterTypes(this._containerExtension);
        this._containerExtension.FinalizeExtension();
    
    
    private IContainerExtension CreateContainerExtension()
    
        return new DryIocContainerExtension(new Container(DryIocContainerExtension.DefaultRules));
    
    #endregion

    #region RegisterTypes
    private void RegisterTypes(IContainerRegistry container)
    
        // Add required registratoins here
    
    #endregion

【讨论】:

为什么不直接迁移到 Prism.DryIoc.Forms ? 我在 Prism.DryIoc.Forms 中找不到引导程序,可用于引导 IoC 容器进行测试。有的话当然可以用。 哦,您正在尝试使用 IOC 容器进行单元测试。我会嘲笑依赖关系

以上是关于在 .NET 6.0 类库中使用 Prism.DryIoc 时“目标平台必须设置为 Windows”的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core在类库中使用当前HttpContext

如何在 .NET Core 类库中引用 Visual Studio 共享项目

无法在我的 .NET 6 类库中解析“AddAuthorization”

如何在标准类库中读取 .Net Core 配置?

asp.net MVC - 我可以从类库中引用视图吗?

Asp.Net 5 类库中未引用 Mscorlib