AppSelfHoseBase 在 .net 5 中启动时生成错误

AppSelfHoseBase generates error when starting in .net 5

我正在尝试在从 .net 5.0 React 模板创建的项目的测试项目中创建一个 apphost。

我收到错误:

OneTimeSetUp: System.TypeLoadException : Could not load type 'Microsoft.Extensions.Primitives.InplaceStringBuilder' from assembly 'Microsoft.Extensions.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

Configure() 中的断点没有命中。

相同的代码似乎在 .net 3.1 项目中运行良好。

这是应用程序主机的要点:

    public class MainAppHost : AppSelfHostBase
    {
        public MainAppHost() : base(nameof(MainAppHost), typeof(MyServices).Assembly) { }


        public override void Configure(Container container)
        {
            //having this blank still triggers error
        }
    }

似乎在 AppHost.Start(url) 上抛出了错误。

堆栈跟踪:

   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) in /_/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs:line 375
   at System.Reflection.ConstructorInfo.Invoke(Object[] parameters) in /_/src/libraries/System.Private.CoreLib/src/System/Reflection/ConstructorInfo.cs:line 18
   at NUnit.Framework.Internal.Reflect.Construct(Type type, Object[] arguments) in /_/src/NUnitFramework/framework/Internal/Reflect.cs:line 113
   at NUnit.Framework.Internal.TypeWrapper.Construct(Object[] args) in /_/src/NUnitFramework/framework/Internal/TypeWrapper.cs:line 252
   at NUnit.Framework.Internal.Commands.ConstructFixtureCommand.<.ctor>b__0_0(TestExecutionContext context) in /_/src/NUnitFramework/framework/Internal/Commands/ConstructFixtureCommand.cs:line 51
   at NUnit.Framework.Internal.Commands.BeforeTestCommand.Execute(TestExecutionContext context) in /_/src/NUnitFramework/framework/Internal/Commands/BeforeTestCommand.cs:line 48
   at NUnit.Framework.Internal.Execution.CompositeWorkItem.PerformOneTimeSetUp() in /_/src/NUnitFramework/framework/Internal/Execution/CompositeWorkItem.cs:line 262

我在同一系统上安装了 3.1 和 5.0,在 NUnit github 上看到了类似的问题,所以我卸载了所有旧版本的 SDK,但没有任何区别。

没有 apphost 的简单 NUnit 测试工作正常:

    public class SimpleTestClass
    {
        [Test]
        public void SimpleTest()
        {
            Assert.That(1 + 1 == 2);
        }
    }

但如果我尝试创建 AppHost,则会收到错误消息:

    public class SimpleTestClass
    {
        public SimpleTestClass()
        {
            var AppHost = new MainAppHost()
                .Init()
                .Start("http://localhost:5619/");
        }

        [Test]
        public void SimpleTest()
        {
            Assert.That(1 + 1 == 2);
        }
    }

测试和服务层都针对 .net 5.0 和项目 运行没问题,我只是无法创建用于测试的 AppHost。

知道我做错了什么吗?

编辑:

我找到了准确的复制步骤:

  1. x 新的 react-spa TestAppHost
  2. 更新所有包
  3. 运行 默认集成测试它会工作
  4. 右键单击测试项目和select“用户机密”,安装提示包。
  5. 运行 相同的集成测试现在因错误而失败。没有 AppHost 的 Nunit 测试仍然可以正常工作。

这是项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <DebugType>portable</DebugType>
    <OutputType>Library</OutputType>
    <UserSecretsId>1f094c52-e2b1-44e1-8e3a-9cf5189d8800</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\TestAppHost.ServiceInterface\TestAppHost.ServiceInterface.csproj" />
    <ProjectReference Include="..\TestAppHost.ServiceModel\TestAppHost.ServiceModel.csproj" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0" />

    <PackageReference Include="NUnit" Version="3.13.2" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.17.*" />
    <PackageReference Include="ServiceStack" Version="5.*" />
    <PackageReference Include="ServiceStack.Kestrel" Version="5.*" />
  </ItemGroup>

</Project>

在提供重现步骤后进行编辑。问题是引用 v5.0.0 的 UserSecrets 作为 .NET 5.0 应用程序中使用的 ServiceStack 的 .NET Standard 2.0 构建仅引用 v2.2.0,您可以将其更改为解决问题,即:

<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="2.2.0" />

当 .NET 6 LTS 发布时,我们将为所有面向 net6.0 的 ServiceStack 库提供一个新的框架目标,这将使您能够引用最新的依赖项版本。


很遗憾,我从未见过这个问题,也不知道如何重现它。

下面是创建 NUnit 集成测试项目的简单方法:

$ mkdir SimpleTestCase && cd SimpleTestCase
$ x mix init-test
$ dotnet test

默认情况下,这 运行 是 .NET 5.0 和 .NET Framework v4.7.2 中的 integration test,这应该会导致测试在两个 .NET 平台上都通过:

您可以在 .NET 5.0 中将其更改为仅 运行,方法是替换:

<TargetFrameworks>net5.0;net472</TargetFrameworks>

<TargetFramework>net5.0</TargetFramework>

如果失败,请查找您安装的 .NET Core 版本:

$ dotnet --list-sdks
3.1.120 [C:\Program Files\dotnet\sdk]
3.1.414 [C:\Program Files\dotnet\sdk]
5.0.104 [C:\Program Files\dotnet\sdk]

然后在你的项目目录中创建一个global.json,其中包含你安装的最新的v5,例如:

{
  "sdk": {
    "version": "5.0.104"
  }
}

这确保特定的 .NET 版本用于 run/test 您的项目,您可以通过 运行ning:

验证
$ dotnet --version