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。
知道我做错了什么吗?
编辑:
我找到了准确的复制步骤:
- x 新的 react-spa TestAppHost
- 更新所有包
- 运行 默认集成测试它会工作
- 右键单击测试项目和select“用户机密”,安装提示包。
- 运行 相同的集成测试现在因错误而失败。没有 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
我正在尝试在从 .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。
知道我做错了什么吗?
编辑:
我找到了准确的复制步骤:
- x 新的 react-spa TestAppHost
- 更新所有包
- 运行 默认集成测试它会工作
- 右键单击测试项目和select“用户机密”,安装提示包。
- 运行 相同的集成测试现在因错误而失败。没有 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