【问题标题】:AppSelfHoseBase generates error when starting in .net 5AppSelfHoseBase 在 .net 5 中启动时生成错误
【发布时间】:2021-12-04 11:19:13
【问题描述】:

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

我收到错误:

OneTimeSetUp:System.TypeLoadException:无法从程序集“Microsoft.Extensions.Primitives,Version=5.0.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60”加载类型“Microsoft.Extensions.Primitives.InplaceStringBuilder”。

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

我在 NUnit github 上看到了由 3.1 和 5.0 安装在同一系统上引起的类似问题,因此我卸载了所有旧版本的 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. 右击测试项目,选择“User Secrets”,安装提示包。
  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>

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    在提供重现步骤后进行编辑。问题在于将 UserSecrets v5.0.0 引用为 .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 版本来运行/测试您的项目,您可以通过运行来验证:

    $ dotnet --version
    

    【讨论】:

    • 感谢您的调查,缩小范围很有帮助。我已经用精确的复制步骤更新了问题。它似乎发生在添加 UserSecrets 包之后。 NUnit 测试将运行良好,但尝试创建应用程序主机将失败并出现错误。
    • @Guerrilla 查看我的更新答案,您需要将版本更改为2.2.0
    • 感谢神话,就像一个魅力:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2018-05-14
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多