Visual Studio总是在重新生成项目?
你是否曾经有过这种感觉:即使代码没有改变,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总是在重新生成项目?的更多相关文章
- Visual Studio 2015 与GitLab 团队项目与管理【2】
前一篇介绍了Git服务器的搭建,我采用的是CentOS7-64位系统,git版本管理使用的是GitLab,创建管理员密码后进入页面. 创建Users,需要记住Username和邮箱,初始密码可以由管理 ...
- 【转】Visual Studio 2010在数据库生成随机测数据
测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...
- Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案
原文:Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案 如果你是用Visual Studio自带的打包项目打包了一个I ...
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...
- Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件出错的解决方案
Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件,运行页面,会出现如下的错误: 错误原因 VisualStudio 2012(或2013) WebFo ...
- visual studio 2015将已有项目添加到码云(gitee)
visual studio 2015将已有项目添加到码云的步骤包括:gitee新建项目.清空项目及VS发布项目 1.gitee新建项目 2.清空项目 清空项目则会将vs项目的master分支发布到gi ...
- SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目
原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-1-setting-up-a-sharpdx-project-in-visual-studi ...
- Visual Studio 2017-2019版本创建C#项目时没有创建网站这一选项?
通过了解以后发现Visual Studio 2017之后的版本在新建选项中已经不再有这一选择项了. 解决办法: 1.在创建新项目的面板滑倒最下面,---> 安装多个人工具和功能 2.这时已经打开 ...
- Visual Studio 2013中的新项目对话框
在Visual Studio 2013,我们推出了添加新的项目对话框. 此对话框取代了是曾在2012年这个的对话框作品,所有ASP.NET项目(MVC,Web窗体和Web API). 这就是我们如何提 ...
随机推荐
- OVS 总体架构、源码结构及数据流程全面解析
在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索.本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍. OVS 架构 OVS 是产品级的虚拟交换机,大量应用在生产 ...
- CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- 如何正确使用javah
bogon:src zexu$ javah -jni -classpath /Users/zexu/github/ijkplayer/android/ijkplayer/ijkplayer-java/ ...
- springboot+多数据源配置
作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ...
- springboot+jpa+thymeleaf增删改查的示例(转)
这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上 ...
- Lua 数组排序 table.sort的注意事项
1. table中不能有nil table.sort是排序函数,它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil. 2. 重写的比较函数,两个值相等时不能return true ...
- 【HTML5】input元素type属性值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- UITableView的性能优化
UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文 ...
- fuser命令使用心得
fuser命令可用于查看正使用指定file, file system, socket port的进程信息.使用-k参数可将这些进程杀掉,-i则在杀掉进程前给出提示 例子: [root@bogon ~] ...
- Dos与Linux的断行字符
Symptom Dos和Linux下面的断行字符是不一样的,至于哪里不一样的呢,先举个例子看一看 Cause 我们也可以使用cat -A filename分别查看Dos和Linux下创建的文件,会发现 ...