我有一个非常奇怪的错误,我没有解释。
所以我的设置非常简单:
我有一个包含2个项目的解决方案,我们将它们命名为 ProjectA 和 ProjectB 。 ProjectA 引用了一些NuGet包,如果构建 ProjectA ,我可以看到输出目录中的所有程序集, bin 文件夹。 ProjectB 现在引用 ProjectA ,但是如果我构建 ProjectB ,我在输出目录中有 ProjectA 程序集,但是而不是 ProjectA 引用的NuGet包。
从 ProjectB 到 ProjectA 的引用随引用 - >一起添加添加参考... - >解决方案 - >项目A
我还创建了一个涵盖这个案例的小测试项目,但它在我的测试项目中运行得很好。
有什么想法吗?
答案 0 :(得分:15)
对于示例场景,假设我们有项目X,程序集A和程序集B.程序集A引用程序集B,因此项目X包含对A和B的引用。此外,项目X包含引用程序集A的代码(例如A.SomeFunction())。现在,您创建一个引用项目X的新项目Y。
因此依赖关系链如下所示: Y => X => A =>乙强>
Visual Studio / MSBuild试图变得聪明,只将引用引入到项目Y中,它检测到项目X需要它;这样做是为了避免项目Y中的参考污染。问题是,由于项目X实际上不包含任何明确使用程序集B的代码(例如B.SomeFunction()),VS / MSBuild不会检测到B是必需的通过X,因此不会将其复制到项目Y的bin目录中;它只复制X和A程序集。
您有两个选项可以解决此问题,这两个选项都会导致程序集B被复制到项目Y的bin目录中:
就个人而言,我个人更喜欢选项2。
以下是我遇到这种情况时通常会添加的“虚拟代码”示例。
// DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
{
// Assembly A is used by this file, and that assembly depends on assembly B,
// but this project does not have any code that explicitly references assembly B. Therefore, when another project references
// this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
// assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
// gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
var dummyType = typeof(B.SomeClass);
Console.WriteLine(dummyType.FullName);
}
答案 1 :(得分:11)
如果依赖图比您描述的更复杂,则可能会出现一些版本问题。
“X,Version = 2,Culture = neutral,PublicKeyToken = null”和“X,Version = 1,Culture = neutral,PublicKeyToken = null”之间存在冲突。
“X,Version = 2,Culture = neutral,PublicKeyToken = null”被选中,因为它是主要的,“X,Version = 1,Culture = neutral,PublicKeyToken = null”不是。
答案 2 :(得分:0)
您的ProjectA是否使用通过NuGet软件包安装的程序集?
如果在ProjectA中使用程序集中的类型,那么构建ProjectB会将它们放在输出目录中。