C# 有没有办法判断一个项目是引用解决方案中的另一个项目,还是仅引用其二进制文件?

C# 有没有办法判断一个项目是引用解决方案中的另一个项目,还是仅引用其二进制文件?,c#,.net,visual-studio,C#,.net,Visual Studio,我创建了以下三个项目: ConsoleApp(控制台应用程序) ProjectReference(类库) 二进制引用(类库) 对于上面提到的每个类库,我添加了一个类,如下所示: 项目参考 namespace ProjectReference { public class Class1 { public string Property1 = "Property 1 from project reference."; } } namespace BinaryReference

我创建了以下三个项目:

  • ConsoleApp(控制台应用程序)

  • ProjectReference(类库)

  • 二进制引用(类库)

  • 对于上面提到的每个类库,我添加了一个类,如下所示:

    项目参考

    namespace ProjectReference
    {
      public class Class1
      {
        public string Property1 = "Property 1 from project reference.";
      }
    }
    
    namespace BinaryReference
    {
      public class Class1
      {
        public string Property1 = "Property 1 from binary reference.";
      }
    }
    
    二进制引用

    namespace ProjectReference
    {
      public class Class1
      {
        public string Property1 = "Property 1 from project reference.";
      }
    }
    
    namespace BinaryReference
    {
      public class Class1
      {
        public string Property1 = "Property 1 from binary reference.";
      }
    }
    
    然后,在ConsoleApp项目中,我单击了添加引用,并从解决方案->项目选项卡中选择了项目引用类库项目

    然后我再次单击ConsoleApp项目中的添加引用,这次从浏览选项卡中,我为二进制引用类库项目选择了二进制文件

    接下来,我构建解决方案。我扩展了ConsoleAppReferences节点,以查看我的两个引用的属性,它们看起来完全相同。如果不是因为我给它们命名的方式,我不可能分辨出哪一个是项目引用,哪一个是二进制文件

    问题

    这让我想知道这两件事:

  • 有没有办法区分这两者

  • 如果两个参考目标都在同一个解决方案中,这是否很重要?在VisualStudio中构建解决方案时,它们都将以正确的顺序构建

  • 即使我想要一个自定义的构建序列,并且想要有一个MS构建脚本,而不是让Visual Studio构建它,这也没有什么区别,因为引用的两个项目都必须首先构建,因为它们是ConsoleApp项目的依赖项

  • 一个比另一个好吗?我过去认为项目参考更好,但现在,我通过这种方式批判性地检查我持有的一些信念,来挑战它们

  • 如果BinaryReference不是解决方案中的一个项目,而是另一个解决方案中的一个项目,情况可能会有所不同(但不是我从未获得过的源代码,因为这不是一个有争议的问题;我们引用的每个Microsoft或第三方程序集都有这样的问题)?在这种情况下,我需要打开另一个具有BinaryReference作为项目引用的解决方案,并在返回到构建此解决方案之前构建它,其中BinaryReference是一个二进制引用


  • 尽管我已经编程多年了,但我之所以提出所有这些问题,是因为我在看一个大型企业项目,解决方案中有无数个项目,其中一些参考文献是可疑的二进制文件,而不是项目文件。棘手的部分是:项目名称与它们生成的程序集的名称不同。

    可以通过检查特定项目的
    *.csproj
    文件(一个Xml文件)来辨别差异。二进制引用使用
    引用
    节点,如下所示

    <Reference Include="{some info}">
        <SpecificVersion>{some value}</SpecificVersion>
        <HintPath>{some path}</HintPath>
        <Private>{some value}</Private>
    </Reference>
    
    <ProjectReference Include="{some path}">
        <Project>{some guid}</Project>
        <Name>{some name}</Name>
    </ProjectReference>
    

    无论是从project还是从binary加载引用,它们都是通过文件路径加载的。无论是从项目还是从二进制文件加载,都不会有任何不同,除非在生成解决方案时,您知道依赖程序集也在生成


    我曾参与过一个企业项目(50个或更多的解决方案和200多个项目),其设置方式是拥有一个内部nugget服务器,并将每个项目的最新版本放在该服务器上。因此,当另一个项目引用某个程序集时,它会查看此本地nugget服务器,并在需要时获取可用的最新程序集文件。

    。。。为什么您关心大型项目中的一些是引用,而另一些是二进制文件?引用松散的DLL已经成为过去。将它们包装在NuGet包中并部署到NuGet服务器,以便您可以管理版本依赖关系。如果它在同一个解决方案中,那么可以进行项目引用。相关:“Visual Studio 2015在同一个解决方案中加载其项目时不再使用对库的二进制引用”@Damien_the_unsiver谢谢。我忘了提到,对于这台特殊的机器,我使用的是VS 2013,但谢谢。这是一篇非常相关的文章。没有直接的关系,但我浪费了一些时间,直到我发现并非MSBuild的所有功能都可以在VisualStudioIDE中访问。