7

我已通过 Nuget 将 ServiceStack.Redis 添加到我拥有的程序集中。该包依赖于 ServiceStack.Common 依赖于 ServiceStack.Text

这个项目是从我的网络项目中引用的,但是当我构建网站并将其加载到浏览器中时,我得到了错误

无法加载文件或程序集“ServiceStack.Text,Version=3.9.24.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

果然,当我转到我网站的 Bin 目录时,它不存在。奇怪的是,如果我转到我正在引用的类库的 Bin 目录(我将 Nuget 包拉入的那个),它就在那里。

回顾一下

  • 类库
    • ServiceStack.Redis 通过 Nuget(包括 ServiceStack.Common 和 ServiceStack.Text)
    • 所有这些都在构建时进入 Bin 目录
  • 网络项目
    • 参考类库
    • ServiceStack.Text外,所有依赖项都移至 Bin

我难住了。有谁知道为什么?

注意:错误似乎是在寻找版本 3.9。24,但 Nuget 拉取的版本是 3.9。26 . 如果我手动将它移动到 Web/Bin,它仍然可以工作

4

3 回答 3

1

检查 .csproj 文件中的程序集引用属性,也许它们仍在引用旧版本的 ServiceStack.Text。有时我发现 NuGet 在包更新期间的某个时候会失败,并使您的程序集引用处于错误状态。例如,您的packages.config文件可能正确显示所有 ServiceStack 引用都具有相同的版本号,但您的.csproj文件可能引用3.9.24forServiceStack.Common3.9.26for ServiceStack.Text。因此,它会将这些程序集的不同版本复制到您的 bin 目录中。它可能仍然可以成功构建,因为您在 NuGet 包目录中缓存了 ServiceStack.Common 的旧副本。

我通过手动编辑 .csproj 文件以获得正确的程序集路径和版本号来解决此问题,或者通过 NuGet 卸载并重新安装受影响的包(这可能需要重新安装大部分/所有 ServiceStack 包,因为 ServiceStack.Text 就是这样低级依赖。

于 2013-06-22T13:32:23.060 回答
1

我在几个版本的 Visual Studio 中遇到了这个有点奇怪的问题,atm 2013。它是随机发生的。

我也依赖于 ServiceStack.Common,它隐含地依赖于 ServiceStack.Text。但是,我没有直接在任何地方引用 ServiceStack.Text 二进制文件中的任何类、结构等。

即使已经设置

复制本地 = true

ServiceStack.Text.dll没有被复制到输出文件夹。

我在许多版本的 ServiceStack dll 中体验过这一点,目前是 v4.0.15。这可能是一个更普遍的 Visual Studio 错误,涉及在不直接使用的库中存在死胡同的依赖链?可能 ServiceStack.Text 在其他 ServiceStack dll 中被标记为依赖项,但 Visual Studio 试图通过查看来超越这一点,可以排除该库(我只是推测)。

无论如何,我通过简单地直接在私有方法中使用 ServiceStack.Text 来解决它,该私有方法放入我自己的库中随机使用的文件中:

/// <summary>
/// Needed because of Visual Studio bug? Don't use this method.
/// </summary>
private JsonValue DontDoIt()
{
    return new ServiceStack.Text.JsonValue();
}

我希望编译器排除一个未使用的私有方法——实际上它可能在 IL 代码中,但这仍然使 VS 将 dll 复制到输出目录。

于 2014-05-17T22:08:33.940 回答
0

正如 esker 所说,更新时 Nuget 可能存在一些问题,但 ServiceStack Nuget 包也存在一些问题。

截至今天工作的最新软件包是 3.9.60。ServiceStack.Text.dll 真的是 3.9.60。

ServiceStack 3.9.61 及更高版本具有 ServiceStack.Text.dll 版本 3.9.59。

复制问题再次出现。

于 2013-09-26T09:40:10.813 回答