为什么不将ServiceStack.Text复制到Bin?

时间:2012-10-27 05:59:28

标签: servicestack nuget

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

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

  

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

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

回顾一下

  • ClassLibrary
    • ServiceStack.Redis via Nuget(包括ServiceStack.Common和ServiceStack.Text)
    • 所有这些都是在构建时的Bin目录中进行的。
  • Web Proj
    • 参考ClassLibrary
    • 所有依赖项都移至Bin ServiceStack.Text
    • 除外

我很难过。有谁知道为什么?

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

即使已经设置

  

复制Local = 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复制到输出目录。

答案 2 :(得分:0)

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

截至今天的最新套餐是3.9.60。 ServiceStack.Text.dll实际上是3.9.60。

ServiceStack 3.9.61及更高版本的ServiceStack.Text.dll版本为3.9.59。

复制问题再次出现。