热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:C#编译/构建增量过程吗?分享

C#编译构建增量过程吗?我们的解决方案包含许多C#项目。它们之间存在复杂的依赖关系,例如。项目ABC,B上的家属,B上的家属。如果我在项目C中更改了一个文件,然后重建解决方案,项目

C#编译/构建增量过程吗?

我们的解决方案包含许多C#项目。 它们之间存在复杂的依赖关系,例如。 项目A / B / C,B上的家属,B上的家属。如果我在项目C中更改了一个文件,然后重建解决方案,项目A,B,C将一起重建。

在C ++中,build包含两个进程,编译和链接。 如果我在项目C中更改了一个文件,那么我构建解决方案,将编译A和B中的相关文件(其他文件将不会被编译,其.obj将在链接过程中重用),然后进行链接。

在java中,只需重新编译项目C中的已更改文件,其他文件将保留,然后打包到.jar。 它重用以前的工作输出(未更改文件的.class)。

总之,C#不重用任何以前的工作输出。 它没有像Java的.class和C ++的.obj那样的任何中间文件。 所以在这一点上,我觉得C#不做增量构建过程。 一些小的改变将导致一个大的构建过程。 我不明白为什么C#不使用以前的工作输出来加速构建过程。

我不确定我对C#编译/构建过程的理解是否正确。 你能帮忙解释一下吗? 非常感谢。

C#编译器进行渐进式编译,我不确定你认为它没有的地方。 也许,由于您的解决方案的复杂性,您无法正确理解依赖关系,并且您认为不需要重新编译的项目实际上是必要的。

检查编译器行为的最佳方法是创建一个简单的虚拟解决方案并使用它:

建立:

  1. 创建一个空的Visual Studio C#解决方案。
  2. 添加任意两个项目AB
  3. 使项目B成为项目A的参考。
  4. B实现一个类FooInB并在A BarInA中的另一个类中使用它。

现在让我们玩这个设置:

  1. 编译解决方案。 您将看到两个项目都编译。
  2. 再次编译解决方案。 您将看到没有任何项目编译,两者都是最新的。
  3. 更改BarInA的实现并再次编译。 您将看到只有一个项目编译, A 。 由于没有变化,因此无需再次编译B
  4. 更改FooInB的实现并最后一次编译。 您将看到两个项目都编译。 这种行为是正确的, A依赖于B因此B任何更改都必须再次重新编译以确保它指向最新版本的B 在理论世界中, C#编译器可以检测到B的更改是否在B中没有后果,因此可以再次“优化”远离建筑物A ,这将是一个噩梦场景,其中每个项目可能引用不同的和过时的汇编版本。

也就是说,我想指出,AFAIK,C#编译器只会在项目级别执行增量编译。 我不知道任何给定程序集内的类级别的任何增量编译优化。 对编译器内部工作有更深入了解的人可能能够澄清这种行为。

你是对的。

如果项目A依赖于项目B.依赖项目B的更改确实需要重新编译项目A.

如果项目B依赖于项目C.项目B的更改,不会使项目C重新编译。

在Java中,一个类/文件被编译为单个.class文件。 因此,当单个文件发生更改时,不会重新编译整个项目。

在分发之前,这些.class文件被组合成.jar。 如果单个.class文件发生更改,则还需要重新组装整个.jar。

在.Net中,您立即将项目编译为程序集(.dll或.exe),因此单个文件更改需要重新编译整个程序集。

在Java环境中可以看到相同的行为,其中.jar(或.apk等依赖项)用于运行/调试应用程序。 在开发过程中也需要整个.jar。 当单个文件发生更改时,将重新编译整个项目。

您始终可以在解决方案之外放置项目。 并且只添加他们生成的.dll的引用。 这将最小化编译时间。

好的..你实际上是在正确的轨道上..如果解决方案中有3个项目,你可以将一个项目的参考提供给另一个项目。 这意味着项目A依赖于项目B依赖于项目C ..

构建项目时,所有构建的文件和dll(来自后构建事件)最终都在该项目的bin文件夹中。

因此,当您构建项目A时,项目C将首先构建(因为A-> B-> C)。 项目B使用项目C的构建组件并创建自己的组件。 和项目A使用B和C的组件并创建自己的组件。

因此,如果您只构建项目A,如果引用正确,您将在项目A的bin文件夹中看到B和C的所有构建文件。

我有一个包含许多项目和更多跨项目参考的解决方案。

为简单起见,我想说我有A BC项目。

我的主要问题是: B需要大约四十五秒才能编译。 现在让我说我只改变C的一小段代码,编译器将编译C ,之后它将编译B ,而不是A因为我主要更改C中编译速度非常快的代码我总是要等待B编译。

我从redgate发现了.NET Daemon 。 这是一个更改构建过程的工具,只有在C的公共API发生更改时才会重建B 这可能会对您的构建过程产生巨大影响。 我想说,根据我的个人经验,它可以节省大约80%的建筑时间。

但是,我只是看了,他们不再卖了它: https : //www.red-gate.com/products/dotnet-development/dotnet-demon/

Visual Studio 2015将介绍微软的新Roslyn编译器,我们认为这些改进使.NET Demon变得多余。

我仍然在Visual Studio 2013上,但我认为对于带有Roslyn的Visual Studio 2015,对构建过程的初步观察以及关于.NET构建的其他答案可能不再适用。 也许它的行为更像是dotnet-deamon构建。

旁注:我的新项目使用IOC容器,所有内容都在主项目中连接,没有太多交叉项目引用。 这也将改善构建过程,因为几乎所有东西都可以并行构建。

所有版本的C#(MSBuild确实)都支持非依赖项目的增量编译。

VS2003中的C#支持项目中的增量编译。 有一个uservoice建议将该function转发到最新的C#版本。

我已经使用Jenkins MSBuild插件进行了测试,增量构建按预期工作,只有重新编译的项目才会被重新编译。

我想要的是进行增量部署,只部署这些已更改/重新编译的dll。 现在我如何才能有效地找到重新编译的dll。

上述就是C#学习教程:C#编译/构建增量过程吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了连接库的定义和使用方法。连接库是通过编译生成的dll文件,例如php_mysql.dll。在使用扩展时,需要去掉配置文件中的分号,并通过phpinfo查看是否正确加载了mysql连接库。详细内容请参考链接:https://www.cnblogs.com/xiaobiaomei/p/7654750.html。摘要字数:180字。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
author-avatar
小妖2502898957
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有