你是否曾经有过这种感觉:即使代码没有改变,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. poj - 1185 炮兵阵地 状压DP 解题报告

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21553   Accepted: 8363 Description ...

  2. Matlab 2014b For Mac安装破解

    1.Matlab 2014b 的安装和破解文件下载: 安装文件:http://www.cncrk.com/downinfo/80718.html 破解文件:http://pan.baidu.com/s ...

  3. 二、springcloud Netflix 注册中心

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  4. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  5. Springboot-添加对jsp支持

    1,在项目的配置文件加入以下依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>j ...

  6. 查看windows、linux的SN

     gwmi win32_bios    [root@live-al-ops-pxe-2 ~]# dmidecode | grep Number | sed -n '1p' Serial Number: ...

  7. 小白的Python之路 day4 生成器

    一.列表生成式  看下面例子: 列表生成式的作用:主要是让代码更简洁(还有装X的效果) 二.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...

  8. C语言应用程序的内存图

    1.综述 c语言应用程序加载到内存,这时它所占据的内存分为四个区,分别为栈Stack,堆Heap,静态存储区Static Area,代码存储区Code Area,这四个区分别放置应用程序的不同部分,从 ...

  9. js变量提升与函数提升

    在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //und ...

  10. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...