我已经通过Nuget将ServiceStack.Redis添加到我拥有的程序集中。该包依赖于ServiceStack.Common,它依赖于ServiceStack.Text
这个项目是从我的网站项目中引用的,但是当我构建网站并在浏览器中加载它时我得到了错误
无法加载文件或程序集'ServiceStack.Text,Version = 3.9.24.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。系统找不到指定的文件。
果然,当我进入我网站的Bin目录时,它就不存在了。奇怪的是,如果我进入我引用的类库的Bin目录(我将Nuget包拉入的那个),那就在那里。
回顾一下
我很难过。有谁知道为什么?
注意:错误似乎是在寻找版本3.9。 24 ,但Nuget版本是3.9。 26 。如果我手动将它移动到Web / Bin,它可以工作
答案 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。
复制问题再次出现。