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

时间:2018-03-21 22:55:32

标签: c# .net servicestack

我正在运行Visual Studio 2017 15.6.3。

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

我有一个引用.NET标准DLL的.NET Core 2.0控制台EXE项目。此EXE使用ServiceStack JsonServiceClient将请求发送到ServiceStack服务。它编译并正常工作。

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

  var extentRequest = new ExtentRequest { ... };
  using (var client = new JsonServiceClient(baseUrl))
  {
    return client.Post(extentRequest);
  }

返回的错误是:“类型'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配置和编译所有项目。
  5. 我认为问题是Framework和Standard版本之间存在某种不匹配。谁能告诉我为什么我会收到这个错误?

1 个答案:

答案 0 :(得分:3)

您无法在 .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 / {{1})托管的支持})。您不能在经典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软件包

为了能够与reference the .NET Standard only .Core packages所需的.NET Framework项目共享AspNetResponse,以便在安装NuGet软件包时 .NET v4.6.1 + 项目引用与.NET Standard或.NET Core项目相同的.NET Standard 2.0 dll。

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

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