none
VS解决方案,编译解决方案,为什么引用项一样会被编译 RRS feed

  • 问题

  • 如题,假设,一个解决方案下面有2个项目:A、B,A引用了B;为什么当B修改后,编译解决方案时,A也会跟着被编译。

    可是如果只编译项目B,不编译项目A,然后整个程序也可以正常运行。

    请问什么办法可以在编译解决方案时,自动跳过项目A的编译。就像只修改了A时,编译解决方案就会只编译A,而自动跳过B。

    2017年10月23日 9:37

答案

  • >>>我想知道的是,引用项明明没有被修改,却还会被编译,那么被编译出来的文件和之前的文件的区别在哪里?

    当VS/MSBuild 在Build我们的项目的时候,它会先去检查这个项目的输入(Inputs)和输出(Outputs)是否是up-to-date, 如果输入发生更改或预期输出丢失,那么项目就需要被编译,这个是VS/MSBuild的默认行为,以保证每次Build 的项目都是最新的。因为你的项目引用了其他项目,那么其他项目的输出将作为引用项目的输入,当你修改了被引用的项目代码,VS/MSBuild在检测输入的时候,会检测这个被引用的项目的输入发生了改变,所以尽管引用项目没有被修改,但是还是会被编译, 是因为项目的输入发生了改变,VS/MSBuild需要保证你在Build整个解决方案时,所有被修改过的项目都被编译。一个简单的例子:

    被引用项目的里面的代码如下:

    namespace MyTestPackage
    {
        public class Class1
        {
            public void test()
            {
                System.Console.Write("This is Referenced project");
            }
        }
    }

    引用项目的代码:

    namespace MyTestProject
    {
        class Program
        {
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                c1.test();
    
                Console.ReadLine();
            }
        }
    }

    当我们第一次运行引用项目时,输出结果是: This is Referenced project

    现在我们修改被引用的项目的代码为: System.Console.Write("This is Referenced project update 1");, 那么最终引用项目的结果为:This is Referenced project update 1. 从这个简单的例子我们可以看出虽然我们没有直接修改引用项目的代码而只是修改了被引用项目的代码,但是引用项的输出结果还是发生了变化,所以VS/MSBuild为了保证你在Build整个solution的时候,所有被修改过的项目(包括inputs和outputs修改的)都要被重新编译一遍以确保所有项目不会有问题。正如上述例子中,VS/MSBuild需要保证你修改了被引用项目中的代码不会对引用项目造成影响,所以会再一次Build引用项目。

    如果你可以确认你修改的代码不会对引用项目造成影响,那么你可以直接单独Build被修改的项目,而不是去Build整个solution. 而被编译出来的文件和之前的文件的区别在于编译之后的文件包含的都是最新的输入和输出。就像例子中编译之后的引用项目的中的输入的代码的值应该就是update1, 而不是之前的值。


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年10月25日 11:02

全部回复


  • Hi  Leo Y. Cheng,

    你的问题和Visual Studio 相关,我将会移到你的帖子到Visual Studio 相关讨论论坛以便获取合适的帮助。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月24日 2:02
  • 你好:

    当你添加了项目之间的引用后,在build时它们会有依赖关系,所以引用项一样会被编译。而文件引用就不会创建生成依赖关系,文件引用是对 Visual Studio 项目上下文之外的程序集的直接引用;通过使用“引用管理器”中的“浏览”选项卡进行创建。如果你希望跳过引用项,那么建议你直接编译项目而不是解决方案。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月24日 8:26
  • 为了引用不被编译,你可以先把被引用项目导成DLL,再添加DLL引用~~
    2017年10月25日 0:22
  • 谢谢。

    我想知道的是,引用项明明没有被修改,却还会被编译,那么被编译出来的文件和之前的文件的区别在哪里?

    2017年10月25日 0:25
  • >>>我想知道的是,引用项明明没有被修改,却还会被编译,那么被编译出来的文件和之前的文件的区别在哪里?

    当VS/MSBuild 在Build我们的项目的时候,它会先去检查这个项目的输入(Inputs)和输出(Outputs)是否是up-to-date, 如果输入发生更改或预期输出丢失,那么项目就需要被编译,这个是VS/MSBuild的默认行为,以保证每次Build 的项目都是最新的。因为你的项目引用了其他项目,那么其他项目的输出将作为引用项目的输入,当你修改了被引用的项目代码,VS/MSBuild在检测输入的时候,会检测这个被引用的项目的输入发生了改变,所以尽管引用项目没有被修改,但是还是会被编译, 是因为项目的输入发生了改变,VS/MSBuild需要保证你在Build整个解决方案时,所有被修改过的项目都被编译。一个简单的例子:

    被引用项目的里面的代码如下:

    namespace MyTestPackage
    {
        public class Class1
        {
            public void test()
            {
                System.Console.Write("This is Referenced project");
            }
        }
    }

    引用项目的代码:

    namespace MyTestProject
    {
        class Program
        {
            static void Main(string[] args)
            {
                Class1 c1 = new Class1();
                c1.test();
    
                Console.ReadLine();
            }
        }
    }

    当我们第一次运行引用项目时,输出结果是: This is Referenced project

    现在我们修改被引用的项目的代码为: System.Console.Write("This is Referenced project update 1");, 那么最终引用项目的结果为:This is Referenced project update 1. 从这个简单的例子我们可以看出虽然我们没有直接修改引用项目的代码而只是修改了被引用项目的代码,但是引用项的输出结果还是发生了变化,所以VS/MSBuild为了保证你在Build整个solution的时候,所有被修改过的项目(包括inputs和outputs修改的)都要被重新编译一遍以确保所有项目不会有问题。正如上述例子中,VS/MSBuild需要保证你修改了被引用项目中的代码不会对引用项目造成影响,所以会再一次Build引用项目。

    如果你可以确认你修改的代码不会对引用项目造成影响,那么你可以直接单独Build被修改的项目,而不是去Build整个solution. 而被编译出来的文件和之前的文件的区别在于编译之后的文件包含的都是最新的输入和输出。就像例子中编译之后的引用项目的中的输入的代码的值应该就是update1, 而不是之前的值。


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年10月25日 11:02