【问题标题】:Observe build with transitive Project Dependencies?观察带有传递项目依赖关系的构建?
【发布时间】:2011-07-08 22:10:08
【问题描述】:

你好 :) 我对 C# / .NET 还很陌生,我对项目依赖性有一些疑问。

首先:我的情况。我有一个解决方案——我们称之为 MyLibrary——它有几个 .dll 输出项目。这些项目相互依赖(作为项目引用),也依赖于一些外部库(.dll-References)。我确保项目引用了外部引用的特定副本。

现在我有第二个解决方案 - MyApplication - 它包含上述一些库项目和其他项目。因此,我自己的所有项目都相互引用了 iva 项目参考。我已经使用参考设置“复制本地:真”设置了所有项目。

我现在的问题是,MyApplication 抛出一个错误,指出其中一个库项目具有不同的版本 - 这很奇怪,因为如果我构建 MyApplication 它应该构建所有必需的项目。

我现在的问题:

  • 如果我的项目 C 依赖于项目 B,而项目 B 又依赖于项目 A,我需要在项目 C 中引用项目 A,即使项目 C 不使用项目 A 中的任何类型。有解决方法吗?
  • 我能否获得一个干净的输出日志,其中说明何时构建哪个项目?从 Visual Studio 输出日志中,我很难区分项目是“重建”还是刚刚复制到目标文件夹
  • 是否有工具可以读取 *.sln 或 *.csproj 文件并直接显示哪些程序集引用了哪些程序集?
  • 正如我所说,我在 MyApplication 中包含了几个来自 MyLibrary 的项目,并将 MyApplication 中 MainProject 的引用设置为“Copy Local: True”。如果我清理 MyApplication(解决方案),它会从 MyLibrary-Destination-Folder 中删除所有 *.dll。我能否以某种方式抑制这种行为(它应该只从 MyApplication-destination-folder 中删除 *.dll)。

感谢四位的帮助。

P.S.:我来自德国,我有一本关于 C# 的“伽利略”书,其中涵盖的主题不是很好。是否有一些很好的教程/书籍直接与 Visual Studio 的项目管理功能有关?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    回答你的几个问题:

    如果我有依赖于的项目 C 项目 B 再次依赖于 项目A,我需要参考项目 即使项目 C 没有,项目 C 中的 A 使用项目 A 中的任何类型。有吗 解决方法?

    我不认为这是真的。如果 B 公开了 A 中的某些类型,则只需要引用 A。例如,如果 B 中的类继承自 A 中的类,那么是的,C 将需要 A,因为 C 需要了解基类。但是,如果 B “隐藏” A 是自己的类/接口,则 C 不需要知道 A。

    是否有工具,可以读出 *.sln 或 *.csproj 文件并直接向我显示哪些程序集引用 哪个大会?

    您可以直接从程序集的元数据中获取此信息。 Reflector 是一个很好的工具。它是免费的,但他们似乎在 4 天前开始收费(太糟糕了!)

    关于 Visual Studio 问题的其他 2 个问题我不太熟悉。但总的来说,我很惊讶您收到版本错误。您是否尝试使用强名称程序集?我个人不建议这样做,除非您将这些程序集提供给公众。如果这些程序集只是为了在您自己的应用程序中分离关注点,那么实际上不应该有版本控制可言。生成的应用程序将针对每个子项目的最新版本进行编译,并且每个子项目只有在发生更改时才会被编译。

    无论如何,您必须在某处指定您需要特定程序集的特定版本(可能在 app.config/web.config 中)。你能从这个配置中删除版本约束吗?

    【讨论】:

    【解决方案2】:

    引用 James Gaunt 的回答

    我不认为这是真的。如果 B 公开了 A 中的某些类型,则只需要引用 A。例如,如果 B 中的类继承自 A 中的类,那么是的,C >将需要 A,因为 C 需要了解基类。但是,如果 B 将 A “隐藏”在所有 > 是自己的类/接口之后,则 C 不需要了解 A。

    非常感谢您的澄清!为了自己复制,我创建了一个包含 3 个项目的示例解决方案:A、B 和 C;有关以下项目的更多详细信息:

    • 项目 C 没有对解决方案上的任何项目的引用;它还定义了一个名为FooC 的类。
    • Project B 引用了Project C,并定义了一个名为FooB 的类,该类还包含两个方法:PrintB 和PrintC。 PrintB 返回的类型是原始值(int),而PrintC 返回的类型是 FooCinstance(在项目 C 上定义的类)。
    • 项目 A 引用了 项目 B,并使用在 项目 B 上实现的功能(FooB 类)。

    所以如果项目 A 中的某个人调用了PrintC 方法,必须需要对项目 C 的引用,因为它的返回类型是项目中定义的类型(类) C(编译器必须解决这个依赖)。但是,如果不是调用 PrintC 方法,而是调用 PrintB,则不需要对 project C 的引用,因为它的返回类型是原始类型(已知类型) .

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2020-08-31
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2021-08-18
      • 2012-12-04
      • 2015-11-02
      相关资源
      最近更新 更多