你是否曾经有过这种感觉:即使代码没有改变,Visual Studio也总是在重新生成项目?

我们可以生成一个项目,然后不做任何处理后再次生成,我们就可以看见——VS正在开始生成项目,而我的项目代码并没有做任何更改。

当我们改变了一些代码,VS在Build时会生成新的项目,这是容易理解的。但代码并没有更新的情况下,项目也会重新生成。这个问题着实困扰了我。带着这个疑问,我做了进一步的探索。

问题分解

我们在这里列出了两个不同的问题:

1)即使项目没有改变,VS也会重新生成项目。

2)当有些东西发生了变化,VS倾向于生成比需要更多的项目。

让我们看看这两个问题的探索结果。

即使项目没有改变,VS也会重新生成项目

即使项目没有改变,VS也会重新生成项目。我们看看这个问题产生的根源。

在我们的解决方案中,转到Tools - > Options。 选择Projects and Solutions - > Build and Run,然后在“MSbuild项目生成输出详细信息”中选择** Diagnostic **。

使用中文版的童鞋,请自行转到工具 - > 选项。 选择项目和解决方案 - > 生成并运行,然后在“MSbuild项目生成输出详细信息”中选择诊断

这样设置后,生成项目将会变得更慢,但会显示为什么需要重新生成。

每当需要重新生成项目时,我们都会看到这样的信息:

在“Output”窗口中,我们可以看到正在重新生成的内容以及原因。例如,我们看到我们有一个“Copy always”属性的图片。

让我们来回顾一下为什么会出现这个问题。

资源设置为“Copy always”

回顾我们刚刚看到的例子。 Copy always,就像这句话的字面意思一样,没有任何理由,谁也阻止不了我的那颗复制的心。 其实是有办法替换Copy always这个选项的。 我们可以在解决方案资源管理器中找到资源文件,按F4查看属性并更改“Copy to output directory”(复制到输出目录)字段。

将CopyLocal的引用设置为true,但VSIX项目并不适用

如果在CopyLocal字段中(在引用属性中)将其设置为True,则会遇到此问题。 简单地说,设置CopyLocal为False解决了这个问题。但这一做法对VSIX项目不适用。VSIX文件中嵌入了所有内容, 因而不需要复制本地文件。

循环依赖

在.NET项目中添加循环依赖是有点困难的。 VS不允许我们直接引用一个项目, 但是我们可以在项目的输出中引用.dll文件。

假设我们有一个引用项目B的项目A.

在项目B中,我们可以添加对A的输出文件路径(A\bin\Debug\A.exe)的引用。

这是一个看似不赖的循环依赖, 但这将导致两个项目每次都会重新生成。

除了去掉项目中的循环依赖,我们没有更好的解决办法。

这些是我知道导致这个问题的原因。如果您遇到更多的原因,请对其进行评论,然后我会添加到这篇文章中。

现在让我们看看另一个问题。

当有些东西发生了变化,VS倾向于生成比需要更多的项目

这不仅仅我的个人感觉,MSBuild以一种特定的方式工作,有时会做更多的工作。下面是这个问题的重现:

假设我们有一个引用项目B的项目A。在项目B中,我们有一个项目A使用的公共函数Foo()。

如果我们将Foo()更改为Foo(int x),那么A必须重新生成。但是,如果我们改变Foo()内部的逻辑,那么编辑器没有理由重新生成A,只需重新生成B即可。但事实上MSBuild将重新生成A和所有引用B的项目。

我认为MSBuild只是根据修改日期工作。如果A引用B,并且使用者在修改A.dll之后修改了B,那么MSBuild也将重新生成A。

我们对此可以做些什么?

大名鼎鼎的ReSharper应该可以解决这个问题。 ReSharper Build是ReSharper自带的,不需要额外的许可证。有关ReSharper的资料,请参阅:

https://www.cnblogs.com/zhaoqingqing/p/3895427.html

ReSharper Build还有其他很酷的功能,可以让你的生成更快。

结语

最严重的浪费就是时间的浪费。对时间宝贵程序猿来说,那些额外的不必要的生成真的很恼人。期待微软在以后Visual Studio版本中解决这个问题。

Visual Studio总是在重新生成项目?的更多相关文章

  1. Visual Studio 2015 与GitLab 团队项目与管理【2】

    前一篇介绍了Git服务器的搭建,我采用的是CentOS7-64位系统,git版本管理使用的是GitLab,创建管理员密码后进入页面. 创建Users,需要记住Username和邮箱,初始密码可以由管理 ...

  2. 【转】Visual Studio 2010在数据库生成随机测数据

    测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...

  3. Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案

    原文:Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案 如果你是用Visual Studio自带的打包项目打包了一个I ...

  4. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  5. Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件出错的解决方案

    Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件,运行页面,会出现如下的错误: 错误原因 VisualStudio 2012(或2013) WebFo ...

  6. visual studio 2015将已有项目添加到码云(gitee)

    visual studio 2015将已有项目添加到码云的步骤包括:gitee新建项目.清空项目及VS发布项目 1.gitee新建项目 2.清空项目 清空项目则会将vs项目的master分支发布到gi ...

  7. SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目

    原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-1-setting-up-a-sharpdx-project-in-visual-studi ...

  8. Visual Studio 2017-2019版本创建C#项目时没有创建网站这一选项?

    通过了解以后发现Visual Studio 2017之后的版本在新建选项中已经不再有这一选择项了. 解决办法: 1.在创建新项目的面板滑倒最下面,---> 安装多个人工具和功能 2.这时已经打开 ...

  9. Visual Studio 2013中的新项目对话框

    在Visual Studio 2013,我们推出了添加新的项目对话框. 此对话框取代了是曾在2012年这个的对话框作品,所有ASP.NET项目(MVC,Web窗体和Web API). 这就是我们如何提 ...

随机推荐

  1. js中常见的一些兼容性问题

    1)滚动条: document.documentElement.scrollTop||document.body.scrollTop 2) 网页可视区域兼容 window.innerHeight || ...

  2. scrapy爬虫框架setting模块解析

    平时写爬虫的时候并不需要设置setting里所有的参数,今天心血来潮,花了点时间查了一下setting模块创建后自动写入的所有参数的含义,记录一下. 模块相关说明信息 # -*- coding: ut ...

  3. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  4. jstl常用语句

    1.select框中if选中,下面的语句实现从后台给过来一个category实体,如果category的categoryType为指定的值,则选中. <select class="fo ...

  5. flask开发没有解决的bug记录

    sqlalchemy.exc.InvalidRequestError sqlalchemy.exc.InvalidRequestError: This Session's transaction ha ...

  6. Highway LSTM 学习笔记

    Highway LSTM 学习笔记 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-4-5   声明 1)该Dee ...

  7. Eclipse 插件安装、升级和卸载的方法

    Eclipse 的插件可以装在内部,也可以装在外部,装在内部的方法很简单:把插件的features和plugins目录copy到eclipse的安装目录即可. eclipse和其插件升级比较频繁,用过 ...

  8. 【java】文件操作java.io.File

    package 文件操作; import java.io.File; import java.io.IOException; public class TestFile { public static ...

  9. JAVA NIO学习一:NIO简介、NIO&IO的主要区别

    在前面学习了IO之后,今天我们开始进入NIO学习环节,首先我们会NIO做一个简单的介绍,让大家认识NIO,然后会和IO进行一个对比认识进行区分.好了,下面我们就开始学习: 一.NIO简介 1.概述 从 ...

  10. go编程之常见工具函数

    1.时间格式化 基于模式的布局进行时间格式化和解析 package main import "fmt" import "time" func main() { ...