热门标签 | 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#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
    目录一、代码背景二、主要工具三、函数解析1、FindWindow:2、FindWindowEx:3、SendMessage: ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 本文介绍了如何通过安装Build Token Root插件并配置身份验证令牌来解决Jenkins远程触发器无法正常工作的问题。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • ARM汇编基础基于Keil创建STM32汇编程序的编写
    文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片&#x ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在本地环境中调试远程服务器上的网站代码执行问题,可以通过以下步骤实现:首先,在本地安装 Visual Studio 并配置远程调试工具。接着,确保服务器和本地机器之间的网络连接畅通,并正确设置防火墙规则以允许调试流量。最后,使用 Visual Studio 的远程调试功能连接到服务器,进行代码调试。这种方法不仅提高了开发效率,还减少了在服务器上直接操作的风险。 ... [详细]
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社区 版权所有