为什么我在 VIsualStudio 2017 中使用 ServiceStack 会收到错误“类型 'IReturn<>' 在未引用的程序集中定义”

Pho*_*ius 3 .net c# servicestack

我正在运行 Visual Studio 2017 15.6.3。

我有一个 .NET Standard 2.0 DLL 项目,其中包含用于 ServiceStack 的请求和响应类。Request 类实现 IReturn<>。

我有一个 .NET Core 2.0 控制台 EXE 项目,它引用了 .NET Standard DLL。此 EXE 使用 ServiceStack JsonServiceClient 向 ServiceStack 服务发送请求。它编译并运行良好。

我添加了一个 .NET Framework 4.6.1 控制台 EXE 项目,该项目也引用了 .NET Standard 2.0 DLL。它必须是一个框架应用程序,因为它引用了与 Core 或 Standard 不兼容的其他 DLL。该 EXE 使用 ServiceStack JsonServiceClient 向 ServiceStack 服务发送请求,与 .NET Core EXE 完全一样,但该程序无法编译。Framework 4.6.1 应该支持 .NET Standard 2.0 DLL,但由于某种原因它与 IReturn<> 接口有冲突。

  var extentRequest = new ExtentRequest { ... };
  using (var client = new JsonServiceClient(baseUrl))
  {
    return client.Post(extentRequest);
  }
Run Code Online (Sandbox Code Playgroud)

返回的错误是:“类型 'IReturn<>' 在未引用的程序集中定义。您必须添加对程序集 'ServiceStack.Interfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=null' 的引用。 ”

我想不出它不起作用的任何原因:

  1. 当我查看项目的引用列表时,我看到 ServiceStack.Interfaces 及其属性说它是版本 5.0.0.0。
  2. 我可以在 Framework 可执行项目代码中使用“Peek Definition”,并通过继承链找到 IReturn<> 以便它知道类型。
  3. 这三个项目都使用通过 NuGet 获得的 ServiceStack 5.0.2 版。
  4. 所有项目均针对 x64 进行配置和编译。

我认为问题是框架和标准版本之间的某种不匹配。谁能告诉我为什么我会收到这个错误?

myt*_*thz 5

您不能在.NET Core.NET Standard项目中与 .NET Framework 依赖项共享.NET Framework .dll,反之亦然。

大多数 ServiceStack NuGet 包都包含 .NET v4.5 和 .NET Standard 2.0 版本:

  • net45- 包含对运行ASP.NET Web 或自托管HttpListener应用程序主机的支持
  • netstandard2.0- 包含仅在ASP.NET Core应用程序主机上运行的支持

只有 .NET v4.5 版本包含对在经典 ASP.NET或 SelfHost HttpListener 主机(即AspNetRequest/ AspNetResponse)上托管的支持。您不能在经典的 ASP.NET Web 项目中使用 ServiceStack 上的 .NET Standard 构建,因为构建实际上不包含所需的依赖项和功能 - 这在 .NET Standard 2.0 中不可用(仅涵盖运行ASP.NET Core应用程序) .

有两种解决方案可以在 .NET Framework v4.6.1+ 和 .NET Standard / .NET Core 项目中共享同一个项目:

仅引用 .Core .NET Standard 包

为了能够.dll与 .NET Framework 项目共享相同的内容,您需要仅引用 .NET Standard.Core包,以便在安装 NuGet 包时您的.NET v4.6.1+项目将引用与 .NET Standard 相同的 .NET Standard 2.0 dll。 NET Standard 或 .NET Core 项目正在使用。

创建多目标 .NET Framework 和 .NET Standard 2.0 项目

另一种方法是维护创建 .NET Framework 和 .NET Standard 版本的多目标项目。这是Hello Mobile Shared Gateway项目用于支持 .NET Framework 和 Mobile .NET Standard 客户端的方法,而ServiceStack Server.Common 项目用于相同的 ServiceStack Server 实现以用于:

  • 当尝试将目标框架为 .NET 4.7.2 的类库从服务堆栈 4.5.8 升级到 5.5.0 时,我看到了同样的错误。@mythz - 有什么想法吗?如果您需要更多详细信息,我可以提出一个新问题。 (2认同)