为什么ServiceStack.Text没有被复制到Bin文件夹?

7
我已经通过Nuget向我所在的程序集中添加了ServiceStack.Redis。该包有一个依赖项ServiceStack.Common,后者又有一个依赖项ServiceStack.Text。
我的Web项目引用了该项目,但当我构建网站并在浏览器中加载它时,出现以下错误:
“无法加载文件或程序集'ServiceStack.Text, Version = 3.9.24.0, Culture = neutral, PublicKeyToken = null'或其某个依赖项。系统找不到指定的文件。”
确实,在我的网站的Bin目录中没有找到该文件。奇怪的是,如果我进入我所引用的类库的Bin目录(我将Nuget包引入其中),它就在那里。
总结一下:
- 类库
ServiceStack.Redis通过Nuget进行安装(包括ServiceStack.Common和ServiceStack.Text)
所有这些都会在构建时出现在Bin目录中
- Web Proj
引用ClassLibrary
所有依赖项都移动到Bin中,只有ServiceStack.Text例外
我被难住了,有人知道为什么吗?
注意:错误似乎在寻找版本3.9.24,但Nuget获取的版本是3.9.26。如果我手动将它移到Web / Bin中,它就可以工作。

你可以尝试这个答案。它对我有用。 - Rafael
3个回答

1

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

我也依赖于ServiceStack.Common,它隐式依赖于ServiceStack.Text。然而,我没有直接引用ServiceStack.Text二进制文件中的任何类、结构或类似物。

即使设置了

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

1
请检查您的.csproj文件中的程序集引用属性,也许它们仍然引用旧版本的ServiceStack.Text。有时我发现,在软件包更新过程中NuGet会失败,并留下程序集引用处于不良状态。例如,您的packages.config文件可能正确显示所有ServiceStack引用都在同一版本号上,但是您的.csproj文件可能会将ServiceStack.Common的版本号设置为3.9.24,而将ServiceStack.Text的版本号设置为3.9.26。因此,它将在bin目录中复制这些程序集的不同版本。尽管您在NuGet软件包目录中缓存了较旧版本的ServiceStack.Common,但它仍然能够成功构建。
我通过手动编辑.csproj文件以具有正确的程序集路径和版本号,或通过NuGet卸载并重新安装受影响的软件包来解决此问题(这可能需要重新安装大部分/所有ServiceStack软件包,因为ServiceStack.Text是如此低级的依赖项)。

0

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

截至今天,最新的可用包是3.9.60。 ServiceStack.Text.dll实际上是3.9.60。

ServiceStack 3.9.61及以上版本的ServiceStack.Text.dll版本为3.9.59。

复制问题再次出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接