你是否曾经有过这种感觉:即使代码没有改变,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. 十三、 Spring Boot 启动加载数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  2. 使用Mkdocs构建你的项目文档

    使用Mkdocs构建你的项目文档 环境搭建 安装必需软件 作者是在windows下安装的,如果是linux或mac用户,官网有更详细的安装说明. windows 10 x64 当然还有广大的windo ...

  3. 自学Python1.2-环境的搭建:Pycharm及python安装详细教程

    Python几乎可以在任何平台下运行,如我们所熟悉的:Windows/Unix/Linux/Macintosh 一.windows下安装Python 1. 从python官方网站:http://www ...

  4. Sphinx学习笔记(一)

    最近负责一个项目,需要用到全文检索,我的环境大体如下:       1.数据保存在MySQL中     2.需要支持中文检索     3.尽可能的简单       选择了Sphinx,至于solr和E ...

  5. 《TCP-IP详解卷2:实现》【PDF】下载

    <TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...

  6. DataBase MongoDB集群方案介绍

    MongoDB集群方案介绍 一.什么是mongodb集群? 是指由多台mongodb服务器组成的服务器集群,称之为mongodb集群. 二.mongodb集群搭建的方式: 1.Replica Set  ...

  7. sqlserver 存储过程 删除

    --删除(delete from) CREATE PROCEDURE [dbo].[DeleteMessage] @strtable varchar(),--要删除信息的表名 @strwhere va ...

  8. Say Hello to ConstraintLayout

    ConstraintLayout介绍 ConstraintLayout让你可以在很平的view结构(没有多层布局嵌套)中构建一个复杂的布局结构. 有点像RelativeLayout, 所有的view都 ...

  9. 小白的Python之路 day4 迭代器

    迭代器 学习前,我们回想一下可以直接作用于for循环的数据类型有以下几种: 1.集合数据类型,如list.tuple.dict.set.str等: 2.是generator,包括生成器和带yield的 ...

  10. 嵌入式设计初体验:永远的hello,world

    目前,xilinx的zynq系列FPGA炒的火热,SOC成为FPGA发展的必然趋势.可见所有功能均用硬件描述语言设计是不科学的.硬件逻辑独有的并行性使其在实时处理和并行算法中占尽优势,但当执行串行操作 ...