程序与技术分享:ASP.NET发展史(【译】)

简介: 程序与技术分享:ASP.NET发展史(【译】)

原文


Part I


0、摘要:


ASP.NET的第一个版本发布于20年前,这些年来,可以看到ASP.NET团队在过去的几年里对网络上发生的重大变化作出的建设性的改变。最初,ASP.NET是一个封闭的平台,试图隐藏和抽象Web。如今ASP.NET已经蜕变成一个开源和跨平台的平台——它完全领会了Web的本质。


这是ASP.NET历史的3篇系列文章的第一部分。涵盖从ASP.NET最初版本到最新的ASP.NET Core。


ASP.NET的第一个版本发布于20年前的2002年初,是.NET框架1.0版本的一部分。它最初的设计目的是提供一个比Classic ASP和ActiveX更好的Web平台,一个对现有Windows开发人员来说比较熟悉的Web平台。


当我们回顾它早期的设计,可能会惊讶地看到MVC、Web Services、JSON或JavaScript类型等概念是//代码效果参考:http://hnjlyzjd.com/hw/wz_24251.html

如何被考虑、讨论和/或引入ASP.NET的,这个时间比你记忆中的时间段更早。

我希望你会享受回忆过去,就像我写它时的心情一样。


1、ASP.NET Web Forms时代(2002-2008)


微软在2002年1月向全世界发布了 ASP.NET 作为.NET 框架1.0版本的一部分。那时XML才是王道,未来是基于 XML Web 服务的。


当时 ASP.NET 的程序经理 Rob Howard 写道:


"在过去的几个月中,业界已经意识到 Web 服务的前景。我有没有提到 XMLWebServices 代表了微软.NET 策略,是 ASP.NET 的一个核心特性吗?"


在 XML 时代,微软并不羞于在 XML 数据孤岛或 XMLHTTP ActiveX 控件等领域推进 IE。几乎没有人预料到其他浏览器会将后者作为标准的 XMLHttpRequest API 来实现,而且它将成为所谓的 Asynchronous JavaScript and XML(AJAX)的基础。当然,浏览器标准只是一个梦想,像 JavaScript 这样用浏览器检测技术来支持多浏览器的技术得到了普遍推广。


这些年也是DHTML(Dynamic HTML)迅速发展与推广的年代(在被标准化的 DOM、 JavaScript 和 CSS 淘汰之前)。用于创建桌面应用程序的企业开发人员正越来越多地转向 Web 应用程序,这些应用程序通常部署在企业内网上。


就在那时,微软发布了.NET 框架1.0以及 Visual Studio.NET,其中 ASP.NET Web Forms 是包的核心部分。这给了微软平台的开发人员一个比以前Classic ASP、 ActiveX 控件和 VB6 DLL 混合体更好的构建 Web 应用程序的方法。


2、Web Forms的设计


千禧年之交,微软开辟了几条重要的战线:


它对Java的拥抱、扩展和消灭策略失败了(最终以诉讼告终),现在它开始提供自己的可与Java竞争的托管语言替代方案


它需要一个更好的解决方案来构建和托管Windows中的Web应用程序,这样它才能在互联网泡沫的背景下继续竞争。


它的 RAD (Rapid Application Development快速应用开发)平台,老旧的 VisualBasic6,需要一个替代品。围绕开发人员的可视化工具和设计人员产生了许多议论,这是开发人员生产力的新银弹。


为了克服这些挑战,微软最终提出了自己的管理和解释平台.NET 框架,以及 C # 和 VB.NET 语言(现在简称为 Visual Basic)。这个框架的1.0版本提供了用于桌面和 Web 开发的特定工具,命名为 Win Forms 和 ASP.NET Web Forms。正如我们将看到的那样,他们的桌面和 Web 框架名称的相似性并非巧合!


Win Forms 被设计成用于开发 Windows 桌面应用程序的 VB6的继承者,为 Visual Studio 中的表单设计器提供了 VB6开发人员所熟悉的 RAD 体验。.NET Web Forms 将为开发 Web 应用程序提供非常类似的体验,在 Visual Studio 中有一个类似的表单设计器,并且编程模型将真正与他们现有的桌面开发人员产生共鸣。它的名字也暗示了这个新框架是Classic ASP 脚本框架的继承者。


VisualStudio2003中的 Web 窗体设计器


这在当时是不可思议的,并且使得习惯于 Windows 应用程序的开发人员更加顺利地过渡到Web开发。或者至少在纸面上,因为这只能通过一些巧妙的抽象来实现,而这些抽象恰恰是构建 Web Forms 框架的基础,这些抽象将隐藏 Web 的真实性,并最终导致向 MVC 的转变!


Web Forms 是按照PageController模式设计的,PageController 模式是经典的 Web 表示模式之一。应用程序中的每个页都创建为 Web Forms并与.Aspx URL关联。页面通过 GET 请求加载并发送到浏览器。页中的控件(如按钮)将导致 POST 到相同的 URL,该 URL 由相同的 Web Forms页(或页控制器)处理。


每个 Web 表单都有两个不同的部分。最终定义页面 HTML 的 aspx 模板,以及实现 Page Controller 并提供必要逻辑的类。


这是 HelloWorld.aspx 模板:


<%@ Page language="c#" Codebehind="HelloWorld.aspx.cs" AutoEventWireup="false" Inherits="HelloWorldPage" %>


[span class="cm-tag">HTML

[span class="cm-tag">body

[span class="cm-tag">form id="Form1"

Name:[span class="cm-tag">asp:textbox id="name" />


[span class="cm-tag">p />


[span class="cm-tag">asp:button id="MyButton" text="Click Here" OnClick="SubmitBtn_Click" />


[span class="cm-tag">p />


[span class="cm-tag">span id="mySpan"




注意:虽然 aspx 文件中使用的视图引擎允许在 块中混合代码,但是这是不可接受的。.NET 社区刚刚摆脱了Classic ASP 及其意大利面条式的代码问题!


及其相应的代码隐藏 HelloWorld.aspx.cs 文件:


using System;


using System.Web.UI;


using System.Web.UI.WebControls;


using System.Web.UI.HtmlControls;


?


public class HelloWorldPage: System.Web.UI.Page


{


protected System.Web.UI.WebControls.TextBox name;


protected System.Web.UI.WebControls.Button MyButton;


protected System.Web.UI.HtmlControls.HtmlGenericControl mySpan;


?


public void SubmitBtnClick(Object sender, EventArgs e)


{


mySpan.InnerHtml = "Hello, " + name.Text + ".";


}


}


ASP.NET 框架提供了一组可以在每个页面上使用的控件。


asp:TextBox 和 asp: Button 标记是服务器控件的示例,它们不是标准的 HTML 标记。发送到客户端的最终 HTML 和 JavaScript 是在呈现页面时由框架生成的,并且取决于页面的属性和潜在的客户端。它们中的每一个都得到一个添加到代码隐藏类中的变量。


还有 HTML 服务器控件,它们与 HTML 元素直接相关,其目的是让代码隐藏类可以访问它们。在前面的示例中有一个 span mySpan,其对应的变量是 code-behind 类。


示例中的 asp: Button显示了另一个有趣的特征。服务器控件可以呈现必要的 HTML 和 JavaScript 来通过 PostBack 请求处理服务器上的事件,这只不过是对同一页面的 POST 请求,以及当前状态和被触发的控件和事件的名称。代码隐藏类中的一个方法可以与这些事件各自关联,这样在处理 PostBack 请求期间就可以在服务器上执行事件对应的方法。与 SubmitBtn Click 方法关联的 MyButton 的click 事件就是一个例子。


如你所见,每个页面都包含一个 HTML Form表单,这将导致浏览器将其作为 POST 请求提交到相同的 URL。然后,服务器将实例化相同的页面控制器类,然后该类可以对Post请求作出反应。


对于习惯于使用桌面应用程序的开发人员来说,这个模型很熟悉,因为在桌面应用程序中,视图和页面控制器作为相同过程的一部分运行。然而,它向他们隐瞒了一个事实,即客户端和服务器是通过一个网络分离的,本质是无状态的。


ASP.NET通过组合拳保存状态:


它的状态管理,结合了不同的保存数据的方法。除了通常的Application和Session State,ASP.NET引入了View State。在将页面HTML发送到浏览器之前,服务器将页面控件的状态编码到Base64编码的字符串中,该字符串作为隐藏的表单字段包含在内。这个隐藏字段将被浏览器自动包含在POST请求中。


一个包含事件的页面生命周期,框架将在处理请求期间的不同时刻自动调用这些事件。这将允许从头初始化页面状态(如从数据库获取)或从发布的View State复原状态(如表单控件的属性)


下图显示了这一流程的运作情况:


ASP.NET 1.0中典型页面的流程


框架的设计假设大部分工作将由服务器完成,客户机主要呈现 HTML 文档并发出新的 GET/POST 请求。这是一个时代的标志,因为那时的客户端不像今天这样强大,浏览器也不像今天这样先进。


总的来说,ASP.NET 成功地实现了它的目标,提供了一个更接近桌面开发的模型和一个用于 Web 开发的 RAD 平台。然而,它在无状态网络上的有状态模型结合了对开发者隐藏Web的抽象,最终损害了框架的长远发展。


当然,自从 ASP.NET 发布以来的这些年我们有了当时人们没有的洞察力,批评或嘲笑20年前做的事情是很容易的。


但是,你会对 ASP.NET 中可能实现的功能感到惊讶!


通过阅读微软的模式和实践团队在2003年6月提供的模式,我发现它特别有趣,所有这些模式都是在 ASP.NET 中实现的:


他们提供了MVC模式的实现,比ASP.NET MVC的第一个版本早了好几年


Front Controller模式的实现只是一个早期的尝试,它将发展成为ASP.NET MVC的路由组件


拦截过滤器模式提供了与ASP.NET MVC中的过滤器类似的功能,甚至是ASP.NET Core中的中间件


的确,大多数开发人员从未遵循过这些模式。是的,指导主要集中在 RAD 方面,以及通过拖放设计器上的控件和在代码隐藏中编写事件处理程序来构建简单方便的应用程序。


但是,正如我们在这些模式中所看到的,开发人员只要稍微努力一下就可以构建干净的应用程序,这也是事实!


在我们继续之前,让我们回想一下在那个时候Web开发世界都发生了什么。


ASP.NET的主要外部竞争对手是Struts和后来的Spring的Java框架。微软似乎认识到了这一点,他们早期的文档中有针对熟悉Struts和J2EE web技术的人的内容,正如JSP (JavaServer页面)迁移文章所介绍的那样。


如前所述,一般的XML和基于XML的Web Services在当时是一个宏伟的设计。ASP.NET有一个通过HTTP提供的Web Services,而.NET框架附带了一个更通用的.NET Remoting, WCF的前身。不同平台(如.NET和Java)之间的Web服务交互是一件大事。


微软仍然拥有大量的VB6、ActiveX和Classic ASP程序员,他们必须转移到新的.NET平台上。正如你想象的那样,大量的工具以及文档被制作出来帮助过渡,就像这一系列收集在他们的官方文件中的文章。


公平地说,ASP.NET 的引入对微软来说是一个巨大的成功。它成为了主要的 Web 开发平台之一,并且在企业界得到了广泛的应用。


3、完善ASP.NET Web Forms


尽管它很成功,但NET 框架还处于起步阶段,亟待成熟和完善。微软采用了每两年发布一次主要新框架版本的时间表,框架所有的部分包括 ASP.NET 都在同一时间进行升级。


2003年.NET Framework 1.1发布了,ASP.NET 收到了移动控件和其他一些小更新。2005年的.NET Framework 2.0框架向前迈进了一大步,走向成熟。


在那一刻.NET 获得了一些最有用和被广泛采用的特性。回首往事,想象自己在写作.NET 代码,而不使用泛型或可空值类型那种感觉真是太奇妙了。让我们简要回顾一下其中的一些特性:


泛型类型的引入使得采用提高可重用性和类型安全性的模式成为可能,比如泛型集合。在泛型之前,运行时强制转换通常会导致异常,并且由于值类型的装箱/拆箱而导致性能损失。微软自己会在框架的许多领域添加泛型方法和类型


还引入了可空类型,因此现在可以在使用Nullable结构(泛型类型的另一个例子)时将null赋值给值类型


C#获得了对静态类的支持。没错,C#在第一个版本中没有静态类!


现在C#和VB.NET中都可以使用部分类。这将极大地帮助Win Forms和Web Forms将Visual Studio生成的设计器代码与用户编写的实际代码分离开来。


一种用于管理事务的新模型,它能够透明地在现有环境事务中获取事务,并在本地事务管理器和Microsoft分布式事务协调器(Microsoft Distributed transaction Coordinator, MSDTC)之间进行提升。这极大地造福了许多使用ADO.NET用于数据访问和/或与现有的COM+组件集成的人。


在专门研究 ASP.NET 2.0时,2.0版本的重要性更加明显。除了受益于新的.NET 特性,比如泛型,ASP.NET经历了一次重大的变革,成为了一个更强大、更易于使用的框架。


这个版本中包含了一个新服务器控件的长列表。事实上,控件成为社区中扩展 ASP.NET 的首选方式之一,并开启了第三方控件供应商的行业。


但是包含更多的控件并不是框架更新的所有内容。


框架还有许多其他的补充和改进,改变了开发体验:


View State得到了改进并缩小了大小,这是对ASP.NET的一个批评(最开始View State太大了)。引入“控件状态”的概念是为了将控件发挥作用(不能禁用)所需的绝对最小数据与视图状态的其余部分分离开来


在引入母版页(Master Pages)之后,实现一致的外观和感觉变得更容易了,母版页的概念接近于ASP.NET MVC与ASP.NET Core中看到的布局。整个网站的样式可以通过主题Themes和皮肤Skins集中起来,主题由许多CSS和皮肤(.Skin)文件组成,皮肤SKin是CSS的XML文件,可以为ASP.NET服务器控件设置属性


现在可以创建站点地图(Site Map)了,这是一个描述网站中页面位置和名称的xml文件。该文件可以直接与新添加的用于导航目的的服务器控件一起使用,能够从站点地图呈现面包屑、菜单或树菜单。


页面生命周期使用了新的事件


现在允许跨页回发。也就是说,一个页面现在可以将POST发送到另一个页面,而不仅仅是发送到它自己


缓存特性得到了显著改进。基于SQL server的新依赖被引入,开发人员现在可以编写他们自己的缓存依赖实现,缓存页面中也允许动态部分(即动态字段也允许页面缓存)


Web部件允许用户对网站进行个性化设置,就像iGoogle或My Yahoo!时间的传送门。服务器控件可以用作Web部件(并且可以创建自定义部件),用户可以从门户类页面中添加、删除和自定义这些Web部件


最后,将工厂设计模式与泛型相结合,以创建所谓的提供者模式(Providers模式)。这只是一个与ASP.NET脱钩的契约。从底层数据的实际来源获取成员资格或概要文件等特性。该框架已经包含了典型源(如SQL Server或XML)的提供者,而开发人员可以创建自己的提供者。然后可以将它们作为提供者配置部分的一部分连接到它们的特性上。


我相信即使只有上面这样一个简短的总结,您也会同意我的观点,即 ASP.NET 2.0总体上是向前迈出的重要一步


然而,您可能已经注意到,对于客户端来说,几乎没有什么新东西。大多数新功能仍然面向服务器,浏览器主要专注于呈现服务器上生成的页面。


这一切即将改变,而且会很快发生!


4、JavaScript 和 AJAX 的重要性


Web 2.0引入了对更多动态网站的需求,越来越需要利用客户端脚本。这种趋势一直持续到2010年前5年,直到这些功能成为现代网站的一个共同特征和预期特征,尤其是在谷歌产品采用了这些功能之后,这种趋势开始进入指数增长。2005年初创造的术语 AJAX (Asynchronous JavaScript and XML)迅速成为一个流行词,无处不在,并成为 Web 开发中的下一个大事件。


在 ASP.NET 2.0之前,AJAX 这个术语还没有被创造出来,也没有被采用,但是它所依赖的 XMLHttpRequest API 已经在浏览器中使用了好几年了。事实上,没有什么能真正阻止 ASP.NET 开发人员创建服务器端端点,然后从 JavaScript 调用这些端点,正如本文介绍 ASP.NET 开发人员使用这种模式的文章所描述的那样。


ASP.NET 2.0认识到 JavaScript 与 XMLHttpRequest 交互的重要性与日俱增(仍然没有通常标识为 AJAX) ,并引入了一个称为脚本回调(Script CallBacks)的特性。这允许从 JavaScript 通过 XMLHttpRequest 调用服务器端方法。这个版本还引入了 ClientScriptManager,这是管理和捆绑每个页面所需的 JavaScript 代码的早期尝试!


在 ASP.NET 2.0即将发布的时候,AJAX 的狂热已经开始了。微软已经注意到并宣布他们正在开发一个代号为 Atlas 的项目,该项目将为 ASP.NET 带来一流的 AJAX 支持。


Atlas 最终在2007年1月以微软 AJAX 1.0的形式发布。除了将 AJAX 带到了 ASP.NET 的前沿,这次发布标志着 ASP.NET 的两个有趣的第一次:


它是独立于.NET框架发布的,作为一个独立的安装程序,将Microsoft AJAX添加到ASP.NET 2.0。在此之前,开发人员必须等待.NET框架2年的发布周期才能获得新特性


AJAX控件工具包的新控件部分的源代码是开源的,可以在CodePlex中获得。客户端JavaScript代码是在MS-PL(微软公共许可证)下发布的,它类似于MIT许可证。服务器端代码使用了更严格的MS-RsL (Microsoft Reference Source License),目的是促进开发和调试。


微软的 AJAX 关注点并不局限于 AJAX 请求,而是集中在当时现代动态网站所需的所有客户端方面:


控件工具包中包含的控件,如日期选择器、手风琴或下拉菜单,包含丰富的客户端功能。包含常规ASP.NET控件的控制扩展程序使得向现有的服务器控件中添加一些新功能变得很容易


像UpdatePanel这样的服务器端控件简化了部分更新页面部分的任务,而不需要编写任何JavaScript代码


引入了一个完整的JavaScript类型系统,允许开发人员使用类型编写JavaScript代码。众所周知,这个想法后来会随着TypeScript的发布再次得到实现和完善。尽管如此,看到早期的尝试还是很有趣的,我想知道在后来的TypeScript开发过程中是否使用了之前开发JavaScript类型系统中学到的经验教训(如果有的话)。


ASMX和WCF Web服务都可以使用新的ServiceReference对象向客户端脚本公开,该对象自动生成一个JavaScript代理来调用服务。


虽然微软 AJAX 的工作接近其初始版本,NET Framework 3.0于2006年11月发布。这个版本的唯一目的是介绍基于 XML 的框架 WCF (Windows Communication Foundation)、 WPF (Windows PresentationFoundation)和 WF (Windows Workflow Foundation)。


直到一年后.NET Framework 3.5于2007年11月发布,ASP.NET 获得了新的特性。最重要的一点是,Microsoft AJAX 现在是框架的一部分。另一个主要特性是包含 ListView 控件,它允许通过定制不同的模板,轻松地为任何数据源构建类似 CRUD 的功能。


我们也不应该忘记.NET 3.5引入了 LINQ (语言集成查询) 这一点,这让包括 ASP.NET 开发人员在内的许多人感到高兴,他们甚至获得了一个特定的 LinqDataSource 控件。


5、结论


在2007年年底,我们有了一个经过3次重大修订的成熟的.NET 框架,其中包括一个非常强大的 ASP.NET 框架。然而,弊端开始显现。ASP.NET 提供的抽象在不需要深入理解 HTML、 HTTP 和 JavaScript的情况下提供的客户端功能方面做得相当不错,但是当事情不能正常工作时,或者需要定制功能时,同样的抽象就会泄露出来并成为阻碍。


通过绑定关注服务器端控件和声明性编程,对开发者隐藏了更多的Web网络现实。当开发人员试图跟上对 Web 应用程序日益增长的期望时,他们会发现自己在围绕框架工作,而不是按照框架预期的方式工作。


与此同时,对于开发者和网络用户来说,事情开始发生变化。Ruby on Rails 于2004年发布,对 Web 开发世界产生了巨大的影响。它的方法与 ASP.NET 有很大的不同,它提供了一个轻量级的 MVC 框架,该框架接受 Web 的优点和局限性,并且明确地试图不妨碍开发人员的工作。相比之下,它使 ASP.NET 看起来又老又重,受到那些寻求更好的 Web 应用开发方法的人的批评,并经常被作为反例。


然而,最大的变化是由第一代 iPhone 引起的。在2007年夏天推出,一旦移动设备的用户数量爆炸式增长,网络将不再是原来的样子!


Part II


0、摘要


第1部分概述了ASP.NET的初始设计以及微软如何对Web Dev的各种变化做出反应。在第二部分中,我们将看看这些变化是如何影响ASP.NET MVC的发展的,最终使ASP.NET转变成一个由多个库组成、可以解决不同问题的更灵活的框架。


.NET 的第一个版本于20年前的2002年初作为.NET 架构的一部分发布。在本系列文章的第一部分中,我们看了它的初始设计,一个提供了比Classic ASP 和 ActiveX 更好的Web 平台,一个对现有的 Windows 开发人员来说熟悉的平台。


随着Web成为最快节奏的平台之一,回顾过去,我们会发现框架别无选择,只能适应自最初发布以来发生在Web及其周围技术上的多种变化。当然,这在当时的变化中并不明显!


在本系列的第二部分中,我们将看看这些变化是如何影响ASP.NET MVC的开发,最终将ASP.NET转变成一个更灵活的框架,该框架由多个库组成,可以解决不同的问题。


1、MVC-新方向(2008-2014)


网络的变化发生得很快,ASP.NET 对此有些准备不足。我们已经讨论过Web表单的抽象意味着Web的现实以及HTTP、HTML和JavaScript是如何对开发人员隐藏的。尽管 ASP.NET 在2002年以服务器为中心的 Web 应用程序和基于 XML 的 Web Services服务的旧世界中运行良好,但 Web 开发的进步使这种抽象变得更加漏洞百出。


一方面,越来越多的功能使用JavaScript 代码实现移动到客户端。尽管 ASP.NET 拥有针对 JavaScript 的工具,特别是当微软的 AJAX 成为框架的一部分时,但是它的重点仍然主要放在控件上。


使用 ScriptManager 编写 JavaScript 并将其添加到页面是可能的,但是要绕过 PostBack 模型并不容易,除非使用 ASMX 或 WCF 服务构建 SPA 应用程序,而 JavaScript 还没有为此做好充分准备。也可以将自定义 JavaScript 添加到自定义服务器控件中,但是这个过程很麻烦。


最终,许多开发人员主要使用 UpdatePanel 之类的控件,以及 AJAX Control Toolkit 的控件/扩展程序部分,而不是编写 JavaScript。


另一方面,JSON 成为 AJAX 请求最常用的有效负载格式,因为它比XML更小,而且易于与通常使用它们的 JavaScript 代码集成。ASP.NET 和 WCF 都专注于基于 XML 的 SOAP 服务,后来增加了对HTTP上的JSON的支持。ASMX Web 服务和 WCF 服务都需要专门配置来处理基于 HTTP 的 JSON。


但这还不是全部。


由于 Web Forms 为 ASP.NET 开发人员抽象了Web,直接使用 JSON 在没有框架中的一流支持的情况下是一个繁琐的后期工作。


总之,当 Ruby on Rails 这样的框架爆发时,我们有一个漏洞百出的 Web //代码效果参考:http://hnjlyzjd.com/hw/wz_24249.html

Forms 抽象,同时 JavaScript 和 JSON 的重要性日益增加。

2、引入ASP.NET MVC


微软意识到了这种情况,在2007年底宣布他们正在开发一个名为 ASP.NET MVC 的新框架,试图解决这些问题。这个框架将是开源的,并且在设计时考虑到可测试性和可插拔性。作为声明的一部分,微软甚至分享了以下关键设计目标清单:


遵循关注点分离原则


授予对生成的HTML的完全控制


为TDD提供一级支持(<a href="

相关文章
|
6月前
|
XML 开发框架 .NET
LabVIEW中加载.NET 2.0,3.0和3.5程序集
LabVIEW中加载.NET 2.0,3.0和3.5程序集
139 4
|
1月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
49 0
|
2月前
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
187 11
|
2月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
2月前
|
自然语言处理 C# 图形学
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
|
4月前
|
Linux C# iOS开发
如何用 WinDbg 调试Linux上的 .NET程序
【7月更文挑战第13天】 1. `dotnet-dump`: Collects process dumps with `dotnet-dump collect -p &lt;process_id&gt;`. 2. `lldb`: Debugs Mono runtime apps on macOS/Linux. 3. **Visual Studio Code**: Remotely debugs .NET via the C# extension. 4. **JetBrains Rider**: Supports remote debugging of .NET on Linux.
|
3月前
|
开发框架 NoSQL .NET
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性
|
3月前
|
Web App开发 数据采集 开发框架
在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧
在.NET程序中整合微软的Playwright,使用 Playwright 的最佳实践和技巧
|
5月前
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
5月前
|
网络协议
技术好文:Smark.Net实现简单聊天程序
技术好文:Smark.Net实现简单聊天程序
35 0

热门文章

最新文章