.NET 5.0来喽

转载:https://blog.csdn.net/powertoolsteam/article/details/109614740?biz_id=102&utm_term=net5.0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-0-109614740&spm=1018.2118.3001.4450

我们很高兴今天.NET5.0正式发布。这是一个重要的版本—其中也包括了C# 9和F# 5大量新特性和优秀的改进。微软和其他公司的团队已经在生产和性能测试环境中开始使用了。这些团队向我们反馈的结果比较令人满意,它证明了对性能提升及降低Web应用托管成本的机会有积极的表现。从预览版1开始,我们一直在5.0上运行我们自己的网站。从我们目前的所见所闻来看,.NET5.0无需在升级上花费太多的精力就能带来巨大的价值。对于你的下一个应用来说,这是一个很好的选择,而且可以直接从早期的.NET Core版本升级。我们希望您在台式机、笔记本电脑和云实例上正式开始使用它。

 

ASP.NET Core、EF Core、C#9和F#5也将在今天一同发布
您可以下载.NET5.0,适用于Windows、MacOS和Linux,适用于x86、x64、Arm32和Arm64。

对于Visual Studio用户,您需要Visual Studio 16.8或更高的版本才能在Windows上使用.NET 5.0,在MacOS上使用最新版本的Visual Studio for Mac)。Visual Studio Code的C#扩展也已经支持.NET5.0和C#9。

NET 5.0是我们的.NET统一之旅的第一个版本。我们构建.NET 5.0是为了让更多的开发人员能够将他们的.NET Framework代码和应用程序迁移到.NET5.0。我们在5.0中也做了很多前期工作,以便Xamarin开发人员在发布.NET6.0时可以使用统一的.NET平台。在后面的文章中会有更多关于.NET统一的内容。

这个版本是完全开源的第五个主要的.NET版本。现在,在GitHub上的DotNet org中,有大量的个人和公司(包括.NET Foundation企业赞助商)作为一个大型社区在.NET的各个方面共同工作,.NET5.0中的改进是许多人通过他们的努力及创新的想法构成的结果,所有这些都超出了微软对该项目的管理。为此,我们向所有为.NET 5.0(以及之前的版本)做出贡献的人表示 “万分感谢”!

我们早在2019年5月就引入了.NET5.0,当时甚至设定了2020年11月的发布日期,结果我们如期发布了,为此要感谢团队中的每一个人,是他们让这一切成为现实! 2021年11月我们还将发布.NET 6.0,今后每年的11月我们都将发布新的.NET版本。
 

.NET 5.0亮点

在.NET5.0中有许多重要的改进:

l  .NET5.0已经在dot.net和Bing.com上托管了几个月,已经经过了数个月的实际测试。

l  许多组件的性能都得到了极大的提高,在.NET5.0中的性能改进、.NET5.0中的ARM64性能和GRPC中都有详细描述。

l  C#9和F#5提供了新的语言改进,比如C# 9的顶级程序和记录,而F# 5提供了交互式编程,.NET上函数式编程的性能得到了提升。

l  .NET库增强了Json序列化、正则表达式和HTTP(HTTP 1.1、HTTP/2)的性能。

l  改进了GC、分层编译和其他方面,P95延迟有所降低。

l  通过ClickOnce客户端发布应用程序,单文件应用程序,减小的容器映像大小以及添加的Server Core容器映像,应用程序部署选项更好。

l  Windows Arm64和WebAssembly扩展了平台范围。

我已经为.NET5.0写了很多Demo。您可以看一下这些.NET5.0示例,以了解更多关于新的C#9和库特性的信息。

平台和Microsoft支持

对于Windows、MacOS和Linux,.Net 5.0的平台支持列表与.NET Core 3.1几乎相同。如果您在受支持的操作系统上使用.NET Core 3.1,则应该能够在该操作系统的大部分版本上采用.NET 5.0。在.NET 5.0中,最重要的新增功能是Windows Arm64。

.Net 5.0是当前版本。这意味着它将在.NET6.0发布后的三个月内得到支持。因此,我们预计到2022年2月中旬将支持.NET5.0。与.NET Core 3.1一样,.NET6.0将是一个LTS版本,并将支持三年。

平台统一的愿景

去年,我们分享了一个统一的.NET生态系统的愿景。它对您的价值在于,您将能够使用同一组API、语言和工具来覆盖广泛的应用类型,其中包括移动、云、桌面和物联网。您可能已经意识到,现在您已经可以使用.NET面向广泛的平台,但可能工具和API在Web和Mobile之间并不总是相同的,或者并不总是同时发布的。

作为.NET5.0和6.0的一部分,我们正在将.NET的产品体验尽可能的进行统一,同时使您能够选择您想要使用的.NET平台的部分。如果你想以Mobile而不是WebAssembly为目标,你不需要下载WebAssembly工具,反之亦然。ASP.NET Core和WPF也是如此。您还可以通过更简单的方式从命令行获取所需的所有.NET工具以及构建和运行时包。我们正在为.NET平台组件提供包管理器体验(包括使用现有的包管理器)。这对于很多场景来说都是很棒的。快速构建开发环境和CI / CD可能是最大的受益者。
实现这一愿景的第一步是整合.NET repos,包括Mono的一个大子集。拥有一个用于运行时和.NET库的repo是在任何地方交付相同产品的前提条件。它还有助于进行广泛的更改,这些更改会影响运行时和库,而这些库以前是有repo边界的。一些人担心,大规模回购将更难管理。事实证明并非如此。

在.NET 5.0版本中,Blazor是利用回购整合和.NET统一的最佳例子。Blazor WebAssembly的运行时和库现在是从合并的 DotNet/runtime repo所构建的。例如,这意味着服务器上的Blazor WebAssembly和Blazor对List<T> 将使用完全相同的代码。但在.NET5.0之前,Blazor并非如此。我们对Blazor WebAssembly采取的方法与我们在.NET6.0中使用Xamarin的方法非常相似。

.NET Framework仍然是受支持的Microsoft产品,并且每个新版本的Windows都将继续支持它。我们去年宣布已经停止向.NET Framework添加新功能,并完成了向.NET Core添加.NET Framework API。这意味着现在是考虑将您的.NET Framework应用程序迁移到.NET Core的好机会。对于.NET Framework客户端开发人员,.NET5.0支持Windows窗体和WPF。我们从许多开发人员那里听说,从.NET Framework移植非常简单。对于.NET Framework服务器开发人员,您需要采用ASP.NET Core才能使用.NET 5.0。对于Web Forms开发人员,我们相信Blazor通过更高效、更现代化的实现提供了类似的开发体验。WCF服务器和工作流用户可以查看支持这些框架的社区项目。从.NET Framework移植到.NET Core文档是一个很好的起点。这就是说,如果你对自己的体验满意,那么让你的应用程序运行在.NET Framework上是一个很好的方法。

Windows团队正致力于研究Reunion作为UWP及其相关技术的下一步。我们一直在与Reunion团队合作,以确保.NET5.0及更高版本能够很好地与WinUI和WebView2协同工作。

让我们来看看5.0版本中的新特性。

语言

C#9和F#5是.NET5.0版本的一部分,包含在.NET5.0 SDK中。Visual Basic也包含在5.0 SDK中。它不包括语言更改,但进行了改进以支持.NET Core上的Visual Basic应用程序框架。

C#源代码生成器是一项重要的C#编译器新特性。从技术上讲,它们不是C#9的一部分,因为它没有任何语言语法。请参阅新的C#源代码生成器示例,帮助您开始使用这一新功能。我们希望在.NET6.0及更高版本的.NET产品中更多地使用源代码生成器。

为了亲身试用新版本,我们部分人决定更新DotNet/iot Repo,以使用新的C#9语法并以.NET5.0尝试目标。它使用顶级程序、记录、模式和切换表达式。它也已更新,以利用.NET库中完整的可为空的注释集。我们还更新了.NET物联网的文档。我们将查看该repo中的几个示例来探索C#9。

LED-BLINK程序是一个不错的紧凑高级程序示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

using System;

using System.Device.Gpio;

using System.Threading;

 

var pin = 18;

var lightTime = 1000;

var dimTime = 200;

 

Console.WriteLine($"Let's blink an LED!");

using GpioController controller = new ();

controller.OpenPin(pin, PinMode.Output);

Console.WriteLine($"GPIO pin enabled for use: {pin}");

 

// turn LED on and off

while (true)

{

    Console.WriteLine($"Light for {lightTime}ms");

    controller.Write(pin, PinValue.High);

    Thread.Sleep(lightTime);

 

    Console.WriteLine($"Dim for {dimTime}ms");

    controller.Write(pin, PinValue.Low);

    Thread.Sleep(dimTime);

}

您可以看到target-typed的使用以及new对controller变量的分配。。GpioController类型仅在赋值的左侧定义。类型是在右手边推断出来的。这种新语法是var的另一种选择,var的类型只显示在赋值的右侧,并通过关键字var在左侧推断。

通过定义方法并利用在相同或其他文件中定义的类型,顶级程序也可能增加复杂性。CharacterLcd示例演示了其中一些功能。

逻辑和属性模式

C# 9包括对新模型的支持。您可以在如下代码中看到关于这个逻辑模式的示例。

1

2

3

4

5

6

var threshChoice = Console.ReadKey();

Console.WriteLine();

if (threshChoice.KeyChar is 'Y' or 'y')

{

   TestThresholdAndInterrupt(ccs811);

}

另一种新模式是属性模式。您可以在我的Mycroft信息访问6.0示例中看到几个属性检查。以下代码摘自PN532 RFID和NFC读取器示例。

1

2

3

4

if (pollingType is not { Length: <=15 })

{

      return null;

}

此代码测试pollingType(类型为byte[]?)。为空或包含>15个字节。这是返回NULL之前需要测试的两个错误条件。也可以将此测试编写为pollingType为空或{Length:>15}。
我想再给你看两个模型。第一个是Mcp25xxx CAN总线逻辑模式

1

2

3

4

5

6

public static byte GetRxBufferNumber(Address address) => address switch

{

    >= Address.RxB0D0 and <= Address.RxB0D7 => 0,

    >= Address.RxB1D0 and <= Address.RxB1D7 => 1,

    _ => throw new ArgumentException(nameof(address), $"Invalid address value {address}."),

};

第二个是Piezo蜂鸣器控制器中的逻辑模式

1

2

3

4

5

6

7

8

9

10

11

12

if (element is not NoteElement noteElement)

{

    // In case it's a pause element we have only just wait desired time.

    Thread.Sleep(durationInMilliseconds);

}

else

{

    // In case it's a note element we play it.

    var frequency = GetFrequency(noteElement.Note, noteElement.Octave);

    _buzzer.PlayTone(frequency, (int)(durationInMilliseconds * 0.7));

    Thread.Sleep((int)(durationInMilliseconds * 0.3));

}

记录

C#9包括一个名为Record的新类。与常规类相比,它有许多优点,其中一半与更简洁的语法有关。以下记录取自Bh1745 RGB传感器绑定。

1

public record ChannelCompensationMultipliers(double Red, double Green, double Blue, double Clear);

然后在同一文件中稍晚一点使用它,语法很熟悉:

1

ChannelCompensationMultipliers = new (2.2, 1.0, 1.8, 10.0);

可为空性注释的改进

现在,.NET库完全为空性添加了注释。这意味着如果您启用nullability,您将从平台获得更多类型信息来指导您使用该功能。目前,还没有对.NET文档进行完整的注释。例如,String.IsNullOrEmpty(String)应该被注释为接受一个字符串?,而String.Split(Char[])的注释是char[]?我们希望这个问题很快就能解决。完整的信息可以在Soure.dot.net上找到,也可以通过Visual Studio中的F12元数据查找获得。

System.Device.Gpio和Iot.Device.Bindings包(这两个包的版本都是1.1.0)也作为此版本的一部分进行了注释,使用了更新的.NET5.0注释。这两个库都是多目标的,但是,我们使用5.0视图为所有目标生成注释。

我们还添加了新的注释类型。大型类在从构造函数调用的帮助器方法中实例化对象成员是很常见的。C#编译器不能遵循对对象赋值的调用流程。当退出构造函数时,它会认为该成员为空,并将使用CS8618发出警告。MemberNotNull属性可以解决此问题。将该属性应用于帮助器方法。然后,编译器将看到您设置了此值,并意识到该方法是从构造函数调用的。MemberNotNullWhen类似。

您可以使用以下代码在BMxx80温度传感器中看到MemberNotNull的示例。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

[MemberNotNull(nameof(_calibrationData))]

private void ReadCalibrationData()

{

   switch (this)

   {

         case Bme280 _:

            _calibrationData = new Bme280CalibrationData();

            _controlRegister = (byte)Bmx280Register.CTRL_MEAS;

            break;

         case Bmp280 _:

            _calibrationData = new Bmp280CalibrationData();

            _controlRegister = (byte)Bmx280Register.CTRL_MEAS;

            break;

         case Bme680 _:

            _calibrationData = new Bme680CalibrationData();

            _controlRegister = (byte)Bme680Register.CTRL_MEAS;

            break;

         default:

            throw new Exception("Bmxx80 device not correctly configured. Could not find calibraton data.");

   }

 

   _calibrationData.ReadFromDevice(this);

}

实际代码使用条件编译。这是因为该项目是多目标的,而该属性仅在.NET5.0+中受支持。使用该属性可以跳过运行时检查(在构造函数中),否则将需要这些检查来满足可空性要求,就像早期的.NET版本一样。

工具类

我们改进了Windows Forms 设计器,使其能在.NET5.0及更高版本中运行,更改了支持WinRT的方式,并进行了其他改进。

Windows窗体设计器

Windows窗体设计器(用于.NET Core 3.1和.NET5.0)已在Visual Studio 16.8中进行了更新,现在支持所有Windows窗体控件。设计器包括您指导的所有设计器功能,包括:拖放、选择、移动和调整大小、控件的剪切/复制/粘贴/删除、与属性窗口的集成、事件生成等。数据绑定和对更广泛的第三方控件集的支持很快就会到来。

 

 

.NET 5.0目标框架

在.NET5.0中,我们更改了用于目标框架的方法。以下项目文件演示了新的.NET5.0目标框架。

 

1

2

3

4

5

6

7

8

<Project Sdk="Microsoft.NET.Sdk">

 

  <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>net5.0</TargetFramework>

  </PropertyGroup>

 

</Project>

  

新的net5.0表单比我们之前使用的样式更紧凑、更直观。此外,我们正在扩展目标框架以描述操作系统依赖关系。我们希望通过.NET 6.0中的Xamarin定位iOS和Android,从而推动了这一变化。
net5.0netcoreapp3.1
 

Windows桌面API(包括Windows窗体、WPF和WinRT)仅在面向net5.0-windows时可用。您可以指定操作系统版本,如net5.0-Windows7或net5.0-windows10.0.17763.0(适用于Windows 2018年10月更新)。如果您想要使用WinRT API,则需要瞄准Windows 10版本。

当使用新的net5.0-windows tfm时,跨平台的场景可能会更具挑战性。例如,System.Device.Gpio演示了一种用于管理Windows目标框架的模式,例如,如果您希望避免为Windows构建或避免在Linux上拉取Windows运行时包。

更新摘要:

  • l  Net5.0是.NET5.0的新目标框架Moniker (TFM)。
  • l  Net5.0结合并取代了netcoreapp和netStandard tfms。
  • l  Net5.0支持.NET Framework兼容模式。
  • l  Net5.0-Windows将用于公开特定于Windows的功能,包括Windows Forms、WPF和WinRT API。
  • l  特定于操作系统的TFMS可以包括操作系统版本号,如net6.0-ios14。
  • l  像ASP.NET Core这样的可移植API将可以在net5.0上使用。同样的情况也适用于Net6.0的Xamarin Forms。

Visual Studio 16.8中的模板仍然以.NET Core 3.1为目标,用于控制台、WPF和Windows窗体应用程序。ASP.NET模板已更新为支持.NET5.0。我们将在Visual Studio 16.9中更新其余模板的模板。

WinRT Interop(重大更改)

关于以Windows API为目标的主题,我们已经转向了一个新的模型,将WinRT API作为.NET5.0的一部分来支持。这包括调用API(双向;CLR<==>WinRT),两个类型系统之间的数据封送处理,以及要在类型系统或ABI边界上被同等对待的类型的统一(即“投影类型”;IEnumerable和IIterable就是例子)。

现有的WinRT互操作系统已作为.NET5.0的一部分从.NET运行时中移除。这是一个突破性的变化。这意味着使用WinRT和.NET Core 3.x的应用程序和库需要重新构建,不能按原样在.NET5.0上运行。使用WinRT API的库需要多目标来管理.NET Core 3.1和.NET5.0之间的这种差异。

展望未来,我们将依靠WinRT团队在Windows中提供的新CsWinRT工具。它生成基于C#的WinRT互操作程序集,这些程序集可以通过NuGet交付。这正是Windows团队正在为Windows中的WinRT API所做的事情。任何想要使用WinRT(在Windows上)作为互操作系统的人都可以使用该工具,以将本机API公开给.NET或将.NETAPI公开给本机代码。

CsWinRT工具在逻辑上类似于tlbimp和tlbexp,但要好得多。TLB工具依赖于.NET运行时中的大量COM互操作管道。CsWinRT工具只依赖于公共的.NETAPI。也就是说,C#9中的函数指针功能--在.NET5.0运行时中部分实现了--在一定程度上是受到CsWinRT工具需求的启发。

这种新的WinRT互操作模型有几个好处:

  • l  它可以独立于.NET运行时进行开发和改进。
  • l  它与为iOS和Android等其他操作系统提供的基于工具的互操作系统是对称的。
  • l  该工具可以利用其他.NET特性(AOT、C#特性、IL链接),而这在以前的系统中不是一个选项。
  • l  简化了.NET运行时代码库。

使用WinRT API不需要添加NuGet引用。以Windows10TFM为目标--刚才在.NET5.0TFM一节中已经讨论过了--已经足够了。如果您的目标是.NET Core 3.1或更早版本,则需要引用WinRT包。您可以在System.Device.Gpio项目中看到此模式。

原生导出

很长一段时间以来,我们一直要求为调用.NET代码的本机二进制文件启用导出。该场景的构建块是托管对UnManagedCeller sOnlyAttribute的API支持。

此功能是创建更高级别体验的构建块。我们团队中的Aaron Robinson一直致力于一个.NET Native Exports项目,该项目为将.NET组件发布为本机库提供了更完整的体验。我们正在寻找有关此功能的反馈,以帮助决定是否应将该方法包含在产品中。

.NET原生导出项目使您能够:

  • l  公开自定义本机导出。
  • l  不需要像COM这样的更高级别的互操作技术。
  • l  跨平台工作。
  • 有一些现有的项目支持类似的场景,例如:
  • l  不受管理的出口。
  • l  DllExport

多年来,我们在本机应用程序中看到了各种.NET托管模型。@rseanHall为此提出并实现了一种新颖的新模型,该模型利用了.NET应用程序托管层提供的所有内置应用程序功能(特别是加载依赖项),同时允许从本机代码调用自定义入口点。这在很多情况下都是完美的,可以想象在从本机应用程序托管.NET组件的开发人员中变得流行起来。这在以前是不存在的。谢谢你的贡献,@rseanHall。

两个主要PR:

  • l  启用从应用上下文调用Get_Runtime_Delegate。
  • l  实现HDT_GET_Function_POINTER

事件管道
事件管道是我们在.NET Core 2.2中添加的一个新的子系统和API,它可以在任何操作系统上执行性能和其他诊断调查。在.NET5.0中,事件管道已得到扩展,使探查器能够编写事件管道事件。此场景对于检测以前依赖ETW(在Windows上)监视应用程序行为和性能的探查器至关重要。

现在可以通过事件管道获得程序集加载信息。这一改进是使类似的诊断功能(例如Fusion Log Viewer)成为.NET Framework的一部分的开始。现在,您可以使用以下命令,使用Dotnet-TRACE来收集此信息:

dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4:4 -- ./MyApp –my-arg 1

该工作流程在DotNet-TRACE文档中进行了说明。您可以看到简单测试应用程序的程序集加载信息。

 

 

Microsoft.Extensions.Logging

我们对Microsoft.Extensions.Logging库中的控制台日志提供程序进行了改进。现在,您可以实现自定义ConsoleForMatter来完全控制控制台输出的格式化和彩色化。格式化程序API通过实现VT-100(受大多数现代终端支持)转义序列的子集来实现丰富的格式化。控制台记录器可以解析出不支持的终端上的转义序列,允许您为所有终端编写一个格式化程序。

除了对定制格式化程序的支持之外,我们还添加了一个内置的JSON格式化程序,它可以将结构化的JSON日志发送到控制台。

 

转储调试

调试托管代码需要了解托管对象和构造。数据访问组件(DAC)是运行时执行引擎的子集,它了解这些构造,可以在没有运行时的情况下访问这些托管对象。在Linux上收集的.Net Core进程转储现在可以在Windows上使用WinDBG或DotNet Dump Analyze进行分析。

我们还添加了对从MacOS上运行的.NET进程捕获ELF转储的支持。由于ELF不是MacOS上的本机可执行文件格式(像lldb这样的本机调试器不能处理这些转储),我们将其作为一种选择加入的特性。要在MacOS上启用转储收集支持,请设置环境变量COMPLUS_DbgEnableElfDumpOnMacOS=1。生成的转储可以使用DotNet Dump Analyze进行分析。

打印环境信息

随着.NET扩展了对新操作系统和芯片体系结构的支持,人们有时想要一种打印环境信息的方式。我们创建了一个简单的.NET工具来完成此任务,名为dotnet-runtimeinfo。

您可以使用以下命令安装和运行该工具。

1

2

dotnet tool install -f dotnet-runtimeinfo

dotnet-runtimeinfo

该工具为您的环境生成以下形式的输出。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

**.NET information

Version: 5.0.0

FrameworkDescription: .NET 5.0.0

Libraries version: 5.0.0

Libraries hash: cf258a14b70ad9069470a108f13765e0e5988f51

 

**Environment information

OSDescription: Linux 5.8.6-1-MANJARO-ARM #1 SMP Thu Sep 3 22:01:08 CEST 2020

OSVersion: Unix 5.8.6.1

OSArchitecture: Arm64

ProcessorCount: 6

 

**CGroup info**

cfs_quota_us: -1

memory.limit_in_bytes: 9223372036854771712

memory.usage_in_bytes: 2740666368

运行时和库
在运行时和库中有很多改进
RyuJIT的代码质量改进
这个版本对JIT有很多改进,我在以前的.NET5.0预览帖中分享了其中的许多改进。在这篇文章中,我提升了来自社区的改变。

  • l  将xmm用于堆栈prolog-dotnet/Runtime#32538-更改为x86/x64 prolog零位调整代码。改进:JSON;TechEmpower。致谢:本·亚当斯。
  • l  用于ARM64的Vectorise位数组-Dotnet/Runtime#33749-BitArray类已更新,包括使用ARM64内部结构的ARM64硬件加速实现。BitArray的性能改进非常显著。感谢@Gnbrkm41。
  • l  动态通用词典扩展特性dotnet/运行时#32270-一些(可能是大多数?)。基于改进了运行库用来存储有关泛型类型和方法的信息的低级(本机代码)字典的实现,泛型的使用现在有了更好的性能(最初的性能发现)。有关更多信息,请参见Perf:COLLECTION COUNT()在Core中比CLR慢。错误报告归功于@RealDotNetDave。
  • l  Implementate Vector.Celing/Vector.Floor Dotnet/Runtime#31993-按照API提案,使用x64和Arm64内部函数实现Vector.Celing/Vector.Floor。感谢@Gnbrkm41。
  • l  TailCall助手的新的、更快的、可移植的实现。来源:Jakob Botsch Nielsen(.NET团队实习生)。来自@dsymetweet的反应。
  • l  添加VectorTableList和TableVectorExtension内部-Credit:@TamarChristinaArm(ARM Holdings)。
  • l  使用新的硬件内部组件BSF/BSR-Credit@saucecontrol提高英特尔架构性能。
  • l  实现向量{Size}.AllBitsSet-Credit@Gnbrkm41。
  • l  允许逃避一些边界检查-Credit@Nathan-Moore

垃圾收集器GC
在GC中进行了以下改进。

  • l  卡片标记窃取-dotnet/coreclr#25986-服务器GC(在不同线程上)现在可以工作窃取,同时标记由老一代对象持有的0/1类对象。这意味着,在某些GC线程标记时间比其他线程长得多的情况下,短暂的GC暂停会更短。
  • l  引入固定对象堆-DotNet/Runtime#32283-添加固定对象堆(PoH)。这个新堆(大对象堆(LOH)的对等体)将允许GC单独管理固定对象,从而避免固定对象对世代堆的负面影响。
  • l  允许从空闲列表分配大对象,同时后台使用空闲列表清理启用了SOH的LOH分配,而BGC正在清理SOH。以前,这只在LOH上使用段末尾空间。这允许更好地使用堆。
  • l  后台GC挂起修复-dotnet/coreclr#27729-挂起修复减少了bgc和用户线程挂起的时间。这减少了在GC发生之前挂起托管线程所需的总时间。Dotnet/coreclr#27578也促成了同样的结果。
  • l  修正了扩展坞中的命名组组处理,增加了对从命名组组读取限制的支持。以前我们只读全球版本。
  • l  优化矢量化排序-Dotnet/Runtime#37159-GC中的矢量化标记列表排序,减少了短暂的GC暂停时间(也包括Dotnet/Runtime#40613)。
  • l  世代感知分析-DotNet/Runtime#40322-世代感知分析,允许您确定哪些老一代对象保留在年轻一代对象上,从而使它们存活下来,并导致短暂的GC暂停时间。
  • l  优化分解GC堆内存页面-Dotnet/Runtime#35896-优化分解,更好地分解逻辑,对于服务器GC来说,完全退出了“停止世界”阶段,从而减少了阻塞GC的暂停时间。

现在,GC通过EgGetGCMmemyInfo方法公开最新集合的详细信息。GCMmemyInfo结构提供有关机器内存、堆内存和您指定的GC类型的最新集合或最新集合的信息-临时GC、完全阻塞GC或后台GC。

使用这个新API的最有可能的用例是日志记录/监视,或者向加载器平衡器指示机器应该停止旋转以请求完整的GC。它还可以通过减小缓存大小来避免容器硬限制。

另一个小而有效的改变是将昂贵的重置内存操作推迟到内存不足的情况。我们预计策略中的这些更改将降低GC延迟(以及总体上的GC CPU使用率)。
Windows ARM64

现在,.NET应用程序可以在Windows Arm64上本地运行。在此之前,我们在.NETCore3.0中添加了对Linux Arm64的支持(对Glibc和MUSL的支持)。使用.NET 5.0,您可以在Windows Arm64设备(如Surface Pro X)上开发和运行应用程序。您已经可以在Windows Arm64上运行.NET Core和.NET Framework应用程序,但需要通过x86仿真。这是可行的,但是原生ARM64执行的性能要好得多。

针对ARM64的MSI安装程序是此版本的最终更改之一。您可以在下图中看到.NET5.0SDK安装程序。

 

 

 

NET 5.0 SDK目前不包含Windows Arm64上的Windows桌面组件-Windows Forms和WPF。这一变化最初是在.NET5.0预览版8中发布的。我们希望在5.0服务更新中添加Windows Arm64的Windows桌面包。我们目前还没有可以分享的日期。在此之前,Windows Arm64支持SDK、控制台和ASP.NET Core应用程序,但Windows桌面组件不支持。

ARM64性能

一年多来,我们在提高ARM64性能方面投入了大量资金。我们致力于使ARM64成为一个基于.NET的高性能平台。这些改进同样适用于Windows和Linux。平台可移植性和一致性一直是.NET令人信服的特点。这包括无论您在哪里使用.NET都能提供出色的性能。在.NET Core 3.x中,ARM64的功能与x64不相上下,但缺少一些关键的性能特性和投资。我们已经在.NET5.0中解决了这个问题,正如在.NET5.0中的ARM64性能中所描述的那样。

改进之处在于:

  • l  调整ARM64的JIT优化(示例)。
  • l  启用并利用ARM64硬件特性(示例)。
  • l  调整ARM64库中的关键性能算法(例如)。

有关更多详细信息,请参见在.NET5.0中提高Arm64性能。

硬件内部属性是我们在.NET Core3.0中添加的一个低级性能特性。当时,我们增加了对x86-64指令和芯片的支持。作为.NET5.0的一部分,我们正在扩展该功能以支持ARM64。仅仅创建内部结构并不能提高性能。它们需要在性能关键型代码中使用。我们在.NET5.0的.NET库中广泛利用了Arm64的内部特性。您也可以在自己的代码中做到这一点,尽管您需要熟悉CPU指令才能做到这一点。

我将用一个类比来解释硬件内部是如何工作的。在很大程度上,开发人员依赖于.NET中内置的类型和API,比如string.Split或HttpClient。这些API通常通过P/Invoke功能利用本地操作系统API。P/Invoke支持高性能的本机互操作,并在.NET库中为此广泛使用。您可以自己使用相同的功能来调用本机API。硬件内部功能类似,不同之处在于它们不是调用操作系统API,而是使您能够在代码中直接使用CPU指令。它大致相当于C++内部函数的.NET版本。硬件本质最好被认为是一种CPU硬件加速功能。它们提供了非常实实在在的好处,现在是.NET库性能基础的关键部分,并负责您可以在.NET5.0性能帖子中读到的许多好处。与C++相比,当.NET内部函数被AOT编译成随时可以运行的文件时,内部函数没有运行时性能损失。

注意:Visual C++编译器具有类似的内部特性。您可以直接将C++与.NET硬件内部功能进行比较,如果您在System.Rune me.Intrinsics.X86.Avx2、x64(AMD64)内部功能列表和英特尔内部功能指南中搜索_mm_i32ather_ep32,就可以看到这一点。你会看到很多相似之处。

我们在5.0中对ARM64的性能进行了第一次重大投资,并将在后续版本中继续这方面的努力。我们直接与ARM Holdings的工程师合作,确定产品改进的优先顺序,并设计最充分利用ARMv8 ISA的算法。其中一些改进将为ARM32带来价值,然而,我们并没有将独特的努力应用于ARM32。如果你使用的是Raspberry Pi,如果你安装了新的Arm64版本的Raspberry Pi OS,你会享受到这些改进。

我们预计苹果将在任何时候发布新的苹果硅基Mac电脑。我们已经有了针对Apple Silicon的.NET6.0的早期版本,并一直在与苹果的工程师合作,帮助为该平台优化.NET。我们在Apple Silicon(Credit@Sickler)上也有一些早期的社区参与。

P95+延迟
我们看到越来越多的大型面向互联网的网站和服务托管在.NET上。虽然有很多合理的关注点放在每秒请求数(RPS)指标上,但我们发现没有大的网站所有者问我们这个问题或要求数百万的RPS。然而,我们听说了很多关于延迟的事情,特别是关于改善P95或P99延迟的问题。通常,为站点配置的机器或核心的数量(以及最大的成本驱动因素)是根据达到特定的P95指标(而不是P50)来选择的。我们认为延迟是真正的“金钱指标”。

我们在Stack Overflow的朋友们在分享他们服务上的数据方面做得很好。他们的一位工程师尼克·克雷弗(Nick Craver)最近分享了他们在迁移到.NET Core后看到的延迟改进:

锁定对象一直是GC性能的长期挑战,特别是因为它们加速(或导致)内存碎片。我们为固定对象添加了一个新的GC堆。固定对象堆基于这样的假设,即进程中固定的对象非常少,但它们的存在会造成不成比例的性能挑战。将固定对象(尤其是那些由.NET库作为实现细节创建的对象)移动到一个独特的区域是有意义的,这样会使世代GC堆中只有很少的固定对象,甚至没有固定对象,因此性能会大大提高。

最近,我们一直在应对大中华区长期存在的挑战。DotNet/Runtime#2795应用了一种新的GC静态扫描方法,在确定GC堆对象的活跃度时避免了锁争用。Dotnet/Runtime#25986使用了一种新算法,用于在垃圾收集的标记阶段跨核心平衡GC工作,这应该会增加大堆垃圾收集的吞吐量,进而减少延迟。

提高分层编译的性能

我们一直致力于改进多版本的分层编译。我们继续将其视为一个关键的性能特性,无论是启动性能还是稳态性能。在这个版本中,我们对分层编译做了两大改进。

分层编译的主要机制是调用计数。一旦一个方法被调用n次,运行库就会要求JIT以更高的质量重新编译该方法。从我们最早的性能分析中,我们知道呼叫计数机制太慢,但没有看到一个简单的方法来解决这个问题。作为.NET5.0的一部分,我们改进了分层JIT编译使用的调用计数机制,以平滑启动时的性能。在过去的版本中,我们看到了在进程生命周期的前10-15秒(主要是Web服务器)中出现的不可预测的性能报告。这个问题现在应该得到解决。

我们发现的另一个性能挑战是对带有循环的方法使用分层编译。根本问题是,您可以使用一个循环多次的冷方法(只调用一次或几次;$lt;n)。我们称这种病态场景为“冷方法;热循环”。很容易想象这种情况会发生在应用程序的Main方法中。因此,默认情况下,我们禁用了具有循环的方法的分层编译。相反,我们允许应用程序选择使用带循环的分层编译。PowerShell是在看到某些场景的高个位数性能改进后选择这样做的应用程序。

为了更好地处理具有循环的方法,我们实现了栈上替换(OSR)。这类似于Java虚拟机具有的同名功能。OSR使当前正在运行的方法执行的代码能够在方法执行过程中重新编译,而这些方法是活动的“堆栈上”。这一功能目前还处于试验阶段和选择加入阶段,并且仅在x64上。

要使用OSR,必须启用多项功能。PowerShell项目文件是一个很好的起点。您会注意到,分层编译和所有快速JIT功能都已启用。此外,需要将COMPLUS_TC_OnStackReplace环境变量设置为1。

或者,您也可以设置以下两个环境变量,假设所有其他设置都有其缺省值:

COMPLUS_TC_QuickJitForLoops=1。
COMPLUS_TC_OnStackReplace=1。
我们不打算在.NET5.0中默认启用OSR,也还没有决定是否会在生产中支持它。
 

在Windows上支持ICU

我们使用ICU库来支持Unicode和全球化,以前只在Linux和MacOS上使用。我们现在在Windows 10上使用相同的库。这一更改使得全球化API的行为在Windows 10、MacOS和Linux之间保持一致,例如特定于区域性的字符串比较。我们还将ICU与Blazor WebAssembly配合使用。
 

将System.DirectoryServices.Protooles扩展到Linux和MacOS

我们一直在添加对System.DirectoryServices.Protooles的跨平台支持。这包括对Linux的支持和对MacOS的支持。Windows支持是预先存在的。

协议是一个比System.DirectoryServices更低级的API,可以支持(或可以用来支持)更多场景。System.DirectoryServices包含仅限Windows的概念/实现,因此它不是跨平台的明显选择。这两个API集都支持控制目录服务服务器并与其交互,如LDAP或Active Directory。

System.Text.Json

System.Text.Json在.NET5.0中得到了显著改进,以提高性能和可靠性,并使熟悉Newtonsoft.Json的人们更容易采用。它还支持将JSON对象反序列化为记录。

如果您正在考虑使用System.Text.Json作为Newtonsoft.Json的替代方案,您应该查看迁移指南。本指南阐明了这两个API之间的关系。Json旨在涵盖许多与Newtonsoft.Json相同的场景,但它并不是要替代流行的JSON库,也不是要实现与流行的JSON库相同的功能。我们试图在性能和可用性之间保持平衡,在我们的设计选择中偏向于性能。
 

HttpClient扩展方法

JsonSerializer扩展方法现在在HttpClient上公开,极大地简化了这两个API的结合使用。这些扩展方法消除了复杂性,并为您处理了各种场景,包括处理内容流和验证内容媒体类型。Steve Gordon很好地解释了在System.Net.Http.Json中使用HttpClient发送和接收JSON的好处。

下面的示例将天气预报JSON数据反序列化为Forecast记录,使用新的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

using System;

using System.Net.Http;

using System.Net.Http.Json;

 

string serviceURL = "https://localhost:5001/WeatherForecast";

HttpClient client = new();

Forecast[] forecasts = await client.GetFromJsonAsync<Forecast[]>(serviceURL);

 

foreach(Forecast forecast in forecasts)

{

    Console.WriteLine($"{forecast.Date}; {forecast.TemperatureC}C; {forecast.Summary}");

}

 

// {"date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"temperatureF":31,"summary":"Scorching"}           

public record Forecast(DateTime Date, int TemperatureC, int TemperatureF, string Summary);

这段代码很紧凑!它依赖于C#9中的顶级程序和记录以及新的GetFromJsonAsync<T>()扩展方法。在如此接近的情况下使用Foreach和Await可能会让您怀疑,我们是否要添加对JSON对象流的支持。我真的希望如此。

您可以在自己的机器上尝试此功能。以下.NET SDK命令将使用WebAPI模板创建天气预报服务。默认情况下,它将在以下网址公开服务:https://localhost:5001/WeatherForecast.。这与示例中使用的URL相同。

1

2

3

rich@thundera ~ % dotnet new webapi -o webapi

rich@thundera ~ % cd webapi

rich@thundera webapi % dotnet run

确保您已经运行了DotNet dev-certs https--首先信任,否则客户端和服务器之间的握手将不起作用。如果遇到问题,请参阅信任ASP.NET核心HTTPS开发证书。

然后,您可以运行上一个示例。

1

2

3

4

5

6

7

8

rich@thundera ~ % git clone https://gist.github.com/3b41d7496f2d8533b2d88896bd31e764.git weather-forecast

rich@thundera ~ % cd weather-forecast

rich@thundera weather-forecast % dotnet run

9/9/2020 12:09:19 PM; 24C; Chilly

9/10/2020 12:09:19 PM; 54C; Mild

9/11/2020 12:09:19 PM; -2C; Hot

9/12/2020 12:09:19 PM; 24C; Cool

9/13/2020 12:09:19 PM; 45C; Balmy

改进了对不可变类型的支持
定义不可变类型有多种模式。记录只是最新的记录。JsonSerializer现在支持不可变类型。

在本例中,您将看到带有不可变结构的序列化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

using System;

using System.Text.Json;

using System.Text.Json.Serialization;

 

var json = "{"date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"temperatureF":31,"summary":"Scorching"} ";          

var options = new JsonSerializerOptions()

{

    PropertyNameCaseInsensitive = true,

    IncludeFields = true,

    PropertyNamingPolicy = JsonNamingPolicy.CamelCase

};

var forecast = JsonSerializer.Deserialize<Forecast>(json, options);

 

Console.WriteLine(forecast.Date);

Console.WriteLine(forecast.TemperatureC);

Console.WriteLine(forecast.TemperatureF);

Console.WriteLine(forecast.Summary);

 

var roundTrippedJson = JsonSerializer.Serialize<Forecast>(forecast, options);

 

Console.WriteLine(roundTrippedJson);

 

public struct Forecast{

    public DateTime Date {get;}

    public int TemperatureC {get;}

    public int TemperatureF {get;}

    public string Summary {get;}

    [JsonConstructor]

    public Forecast(DateTime date, int temperatureC, int temperatureF, string summary) => (Date, TemperatureC, TemperatureF, Summary) = (date, temperatureC, temperatureF, summary);

}

  

注意:JsonConstructor属性是指定要与结构一起使用的构造函数所必需的。对于类,如果只有一个构造函数,则不需要该属性。记录也是如此。

它会产生以下输出:

 

1

2

3

4

5

6

rich@thundera jsonserializerimmutabletypes % dotnet run

9/6/2020 11:31:01 AM

-1

31

Scorching

{"date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"temperatureF":31,"summary":"Scorching"}

支持记录
JsonSerializer对记录的支持几乎与我刚才向您展示的对不可变类型的支持相同。我想在这里展示的不同之处在于将JSON对象反序列化为一个记录,该记录公开了一个参数化的构造函数和一个可选的init属性。

以下是程序片段,包括Record定义:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

using System;

using System.Text.Json;

 

Forecast forecast = new(DateTime.Now, 40)

{

    Summary = "Hot!"

};

 

string forecastJson = JsonSerializer.Serialize<Forecast>(forecast);

Console.WriteLine(forecastJson);

Forecast? forecastObj = JsonSerializer.Deserialize<Forecast>(forecastJson);

Console.Write(forecastObj);

 

public record Forecast (DateTime Date, int TemperatureC)

{

    public string? Summary {get; init;}

};

它会产生以下输出:

1

2

3

rich@thundera jsonserializerrecords % dotnet run

{"Date":"2020-09-12T18:24:47.053821-07:00","TemperatureC":40,"Summary":"Hot!"}

Forecast { Date = 9/12/2020 6:24:47 PM, TemperatureC = 40, Summary = Hot! }

改进了对Dictionary<K,V>的支持

JsonSerializer现在支持使用非字符串键的字典。您可以在下面的示例中看到这是什么样子。在.NET Core 3.0中,此代码进行编译,但会引发NotSupportdException异常。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

using System;

using System.Collections.Generic;

using System.Text.Json;

 

Dictionary<intstring> numbers = new ()

{

    {0, "zero"},

    {1, "one"},

    {2, "two"},

    {3, "three"},

    {5, "five"},

    {8, "eight"},

    {13, "thirteen"},

    {21, "twenty one"},

    {34, "thirty four"},

    {55, "fifty five"},

};

 

var json = JsonSerializer.Serialize<Dictionary<intstring>>(numbers);

 

Console.WriteLine(json);

 

var dictionary = JsonSerializer.Deserialize<Dictionary<intstring>>(json);

 

Console.WriteLine(dictionary[55]);

它会产生以下输出。

1

2

3

rich@thundera jsondictionarykeys % dotnet run

{"0":"zero","1":"one","2":"two","3":"three","5":"five","8":"eight","13":"thirteen","21":"twenty one","34":"thirty four","55":"fifty five"}

fifty five

对字段的支持

JsonSerializer现在支持字段。这一变化是由@YohDeadfall贡献的。谢谢!。

您可以在下面的示例中看到这是什么样子。在.NET Core 3.0中,JsonSerializer无法序列化或反序列化使用字段的类型。对于具有字段且无法更改的现有类型,这是一个问题。有了这一变化,这就不再是问题了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

using System;

using System.Text.Json;

 

var json = "{\"date\":\"2020-09-06T11:31:01.923395-07:00\",\"temperatureC\":-1,\"temperatureF\":31,\"summary\":\"Scorching\"} ";          

var options = new JsonSerializerOptions()

{

    PropertyNameCaseInsensitive = true,

    IncludeFields = true,

    PropertyNamingPolicy = JsonNamingPolicy.CamelCase

};

var forecast = JsonSerializer.Deserialize<Forecast>(json, options);

 

Console.WriteLine(forecast.Date);

Console.WriteLine(forecast.TemperatureC);

Console.WriteLine(forecast.TemperatureF);

Console.WriteLine(forecast.Summary);

 

var roundTrippedJson = JsonSerializer.Serialize<Forecast>(forecast, options);

 

Console.WriteLine(roundTrippedJson);

 

public class Forecast{

    public DateTime Date;

    public int TemperatureC;

    public int TemperatureF;

    public string Summary;

}

它会产生以下输出。

1

2

3

4

5

6

rich@thundera jsonserializerfields % dotnet run

9/6/2020 11:31:01 AM

-1

31

Scorching

{"date":"2020-09-06T11:31:01.923395-07:00","temperatureC":-1,"temperatureF":31,"summary":"Scorching"}

保留JSON对象图中的引用

JsonSerializer增加了对在JSON对象图中保留(循环)引用的支持。它通过存储ID来实现这一点,当JSON字符串被反序列化为对象时,这些ID可以重新组成。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

using System;

using System.Collections.Generic;

using System.Text.Json;

using System.Text.Json.Serialization;

 

Employee janeEmployee = new()

{

    Name = "Jane Doe",

    YearsEmployed = 10

};

 

Employee johnEmployee = new()

{

    Name = "John Smith"

};

 

janeEmployee.Reports = new List<Employee> { johnEmployee };

johnEmployee.Manager = janeEmployee;

 

JsonSerializerOptions options = new()

{

    // NEW: globally ignore default values when writing null or default

    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,

    // NEW: globally allow reading and writing numbers as JSON strings

    NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString,

    // NEW: globally support preserving object references when (de)serializing

    ReferenceHandler = ReferenceHandler.Preserve,

    IncludeFields = true// NEW: globally include fields for (de)serialization

    WriteIndented = true,};

 

string serialized = JsonSerializer.Serialize(janeEmployee, options);

Console.WriteLine($"Jane serialized: {serialized}");

 

Employee janeDeserialized = JsonSerializer.Deserialize<Employee>(serialized, options);

Console.Write("Whether Jane's first report's manager is Jane: ");

Console.WriteLine(janeDeserialized.Reports[0].Manager == janeDeserialized);

 

public class Employee

{

    // NEW: Allows use of non-public property accessor.

    // Can also be used to include fields "per-field", rather than globally with JsonSerializerOptions.

    [JsonInclude]

    public string Name { getinternal set; }

 

    public Employee Manager { getset; }

 

    public List<Employee> Reports;

 

    public int YearsEmployed { getset; }

 

    // NEW: Always include when (de)serializing regardless of global options

    [JsonIgnore(Condition = JsonIgnoreCondition.Never)]

    public bool IsManager => Reports?.Count > 0;

}

性能

在.NET5.0中,JsonSerializer的性能得到了显著提高。Stephen Toub在他的.NET5帖子中谈到了JsonSerializer的一些性能改进。我还在.NET5.0RC1文章中更详细地介绍了Json的性能。
 

应用程序部署

在编写或更新应用程序之后,您需要部署它以使您的用户受益。这可能是到Web服务器、云服务或客户端计算机,也可能是使用Azure DevOps或GitHub操作等服务的CI/CD流的结果。

我们努力提供一流的部署功能,自然地与应用程序类型保持一致。对于.NET5.0,我们专注于改进单文件应用程序,减少停靠多阶段构建的容器大小,并为使用.NET Core部署ClickOnce应用程序提供更好的支持。
 

容器

我们认为容器是最重要的云趋势,并在这方面投入了大量资金。我们正在以多种方式投资容器,在.NET软件堆栈的多个级别上。首先是我们对基本面的投资,这越来越多地受到容器场景和部署容器应用的开发者的影响。

我们正在让与集装箱管弦乐团的合作变得更容易。我们已经添加了OpenTelemeter支持,这样您就可以从您的应用程序中捕获分布式跟踪和指标。DotNet-monitor是一种新工具,旨在作为从.NET进程访问诊断信息的主要方式。特别是,我们已经开始构建dotnet-monitor的容器变体,您可以将其用作应用程序侧车。最后,我们正在构建DotNet/Tye,以此来提高微服务开发人员的工作效率,包括开发和部署到Kubernetes环境。

NET运行时现在支持cgroup v2,我们预计它将在2020年后成为与容器相关的重要API。Docker目前使用的是cgroup v1(已经被.NET支持)。相比之下,cgroup v2比cgroup v1更简单、更高效、更安全。您可以通过我们2019年Docker更新了解更多关于cgroup和Docker资源限制的信息。Linux发行版和容器运行时正在添加对cgroup v2的支持。一旦cgroup v2环境变得更加普遍,.Net 5.0将在cgroup v2环境中正常工作。这归功于Omair Majid,他在Red Hat支持.NET。

除了Nano Server,我们现在还发布Windows Server Core镜像。我们添加了Server Core,因为我们收到了客户的反馈,他们想要一个与Windows Server完全兼容的.NET映像。如果你需要这个,那么这张新照片就是为你准备的。支持Windows Server 2019长期服务渠道(LTSC)、.NET5.0和x64的组合。我们还进行了其他更改,以减小Windows服务器核心映像的大小。这些改进带来了很大的不同,但都是在Windows Server 2019发布之后做出的。然而,它们将使下一个Windows Server LTSC版本受益。

作为使用“.NET”作为产品名称的一部分,我们现在将.NET Core 2.1、3.1和.NET5.0镜像发布到mcr.microsoft.com/dotnet系列的Repos中,而不是发布到mcr.microsoft.com/dotnet/core。我们将继续将.NET Core 2.1和3.1双重发布到以前的位置,同时支持这些版本。.Net 5.0图像将仅发布到新位置。请相应地更新您的From语句和脚本。

作为.NET5.0的一部分,我们将SDK镜像重新建立在ASP.NET镜像之上,而不是构建包-dep,以显著减小您在多阶段构建场景中拉取的聚合镜像的大小。

此更改对于多阶段构建有以下好处,其中包含一个示例Dockerfile:

Ubuntu 20.04 Focus的多阶段构建成本:

Pull Image

Before

After

sdk:5.0-focal

268 MB

232 MB

aspnet:5.0-focal

64 MB

10 KB (manifest only)

减少了约: 100 MB (-30%)

Debian 10 Buster的多阶段构建成本:

Pull Image

Before

After

sdk:5.0

280 MB

218 MB

aspnet:5.0

84 MB

4 KB (manifest only)

减少了约: 146 MB (-40%)

有关更多详细信息,请参见Dotnet/Dotnet-docker#1814。

此更改有助于多阶段构建,其中SDK和您的目标aspnet或运行时镜像的版本相同(我们预计这是常见的情况)。在进行此更改时,(例如)aspnet拉入将是不可行的,因为您将通过最初的SDK拉入拉出aspnet层。

我们对阿尔卑斯和Nano服务器做了类似的更改。阿尔卑斯和Nano服务器都没有Buildpack-dep镜像。但是,阿尔卑斯和Nano Server的SDK镜像之前并不是在ASP.NET镜像之上构建的。我们解决了这个问题。你将会看到阿尔卑斯和Nano服务器以及5.0版本在多阶段构建方面都获得了巨大的成功。
 

单文件应用程序

单个文件应用程序作为单个文件发布和部署。该应用程序及其依赖项都包含在该文件中。当应用程序运行时,依赖项直接从该文件加载到内存中(不会影响性能)。

在.NET5.0中,单文件应用程序主要集中在Linux上(稍后会详细介绍)。它们可以是依赖于框架的,也可以是独立的。依赖于全球安装的.NET运行时,依赖于框架的单个文件应用程序可能非常小。自包含的单文件应用程序较大(由于带有运行库),但不需要在安装前安装.NET运行库,因此可以直接运行。一般来说,依赖于框架对开发和企业环境都有好处,而对于ISV来说,自包含通常是更好的选择。

我们用.NET Core 3.1制作了一个版本的单文件应用程序。它将二进制文件打包到单个文件中进行部署,然后将这些文件解压缩到一个临时目录中以加载和执行它们。在某些情况下,这种方法可能会更好,但我们希望我们为5.0构建的解决方案会更好,这是一个值得欢迎的改进。

要创建真正的单一文件解决方案,我们需要克服多个障碍。关键任务是创建一个更复杂的应用程序捆绑器,并教导运行库从二进制资源加载程序集。我们还遇到了一些无法逾越的障碍。

在所有平台上,我们都有一个称为“apphost”的组件。这是成为可执行文件的文件,例如Windows上的myapp.exe或基于Unix的平台上的./myapp。对于单一文件应用程序,我们创建了一个新的apphost,我们称之为“超级主机”。它具有与常规apphost相同的角色,但还包括运行时的静态链接副本。超级主机是我们单一文件方法的一个基本设计点。这个模型就是我们在带有.NET5.0的Linux上使用的模型。由于各种操作系统的限制,我们无法在Windows或MacOS上实现这种方法。我们在Windows或MacOS上没有超级主机。在这些操作系统上,本地运行时二进制文件(大约3个)位于单个文件应用程序旁边(导致“不是单个文件”)。我们将在.NET6.0中重新讨论这种情况,然而,我们预计我们遇到的问题仍然具有挑战性。

您可以使用以下命令来生成单文件应用程序。

l  依赖框架的单文件APP:

n  DotNet PUBLISH-r Linux-x64--自含式FALSE/p:PublishSingleFile=TRUE。

l  自含式单文件APP:

n  DotNet PUBLISH-r Linux-x64--自含式TRUE/p:PublishSingleFile=TRUE

 

您还可以使用项目文件配置单个文件发布。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<Project Sdk="Microsoft.NET.Sdk">

 

  <PropertyGroup>

    <OutputType>Exe</OutputType>

    <TargetFramework>net5.0</TargetFramework>

    <!-- The OS and CPU type you are targeting -->

    <RuntimeIdentifier>linux-x64</RuntimeIdentifier>

    <!-- Determine self-contained or framework-dependent -->

    <SelfContained>true</SelfContained>

    <!-- Enable single file -->

    <PublishSingleFile>true</PublishSingleFile>

  </PropertyGroup>

 

</Project>

您可以尝试使用程序集修剪来减小应用程序的大小。它可能会通过过度修剪来破坏应用程序,因此建议在使用此功能后彻底测试您的应用程序。程序集调整还会移除提前编译的读到运行本机代码(用于被调整的程序集),这主要是为了提高性能。您需要在裁剪之后测试应用程序的性能。通过使用PublishReadyToRun属性(并设置为true),您可以在裁剪后即可运行编译您的应用程序。

注:

  • l  应用程序是特定于操作系统和架构的。您需要发布每种配置(Linuxx64、LinuxArm64、Windowsx64、…)。。
  • l  配置文件(如*.runtimeconfig.json)包含在单个文件中。如果需要,您可以在单个文件旁边放置额外的配置文件(可能是为了测试)。
  • l  默认情况下,单个文件中不包括.pdb文件。您可以使用<DebugType>Embed</DebugType>属性启用PDB嵌入。
  • l  IncludeNativeLibrariesForSelfExtract属性可用于在Windows和MacOS上嵌入本机运行时二进制文件,但它们必须在运行时解压缩到临时存储中。不建议在一般情况下使用此功能。

ClickOnce

多年来,ClickOnce一直是流行的.NET部署选项。现在,它被.NET Core 3.1和.NET5.0 Windows应用程序支持。当我们将Windows窗体和WPF支持添加到.NET Core 3.0中时,我们知道很多人会希望使用ClickOnce进行应用程序部署。在过去的一年里,.NET和Visual Studio团队共同努力,在命令行和Visual Studio中启用ClickOnce发布。

从项目一开始,我们就有两个目标:

  • l  在Visual Studio中为ClickOnce启用熟悉的体验。
  • l  使用MSBuild或MAGE工具,通过命令行流为ClickOnce发布启用现代CI/CD。
  • 用图片向你展示这种体验是最容易的。


让我们从Visual Studio体验开始,它以项目发布为中心。

 

 

我们目前支持的主要部署模式是依赖于框架的应用程序。很容易依赖于.NET桌面运行时(即包含WPF和Windows窗体的桌面运行时)。如果需要,ClickOnce安装程序将在用户计算机上安装.NET运行时。我们还打算支持独立和单一文件应用程序。

 

 

 

您可能会想,您是否仍然能够利用ClickOnce脱机和更新功能。可以,停那儿吧。

 

 

 

MAGE最大的变化是它现在是一个.NET工具,发布在NuGet上。这意味着你不需要在你的机器上安装任何特殊的东西。您只需要.NET5.0SDK,然后就可以将MAGE安装为一个.NET工具。您也可以使用它发布.NET Framework应用程序,但是,SHA1签名和部分信任支持已被移除。

MAGE安装命令如下:

dotnet tool install -g Microsoft.DotNet.Mage

在您制作并分发了ClickOnce安装程序之后,您的用户将看到熟悉的ClickOnce安装对话框。

 

 

 

当您使更新可用时,您的用户将看到更新对话框。

 

 

 

最后总结

Net 5.0是另一个大版本,它应该会改进你使用.NET的许多方面。我们已经实现了一系列的改进,从单文件应用程序到性能,从Json序列化的可用性到ARM64的支持。虽然今天可能是您使用.NET5.0的第一天,但我们在微软的产品中运行.NET5.0已经有几个月了。我们相信,它已准备好供您使用、运营您的业务并为您的应用程序提供动力。C#9和F#5中的新语言改进应该会使您的代码更具表现力,更易于编写。对于您现有的应用程序来说,.Net 5.0也是一个很好的选择。在许多情况下,您可以毫不费力地升级。

如果您对性能感兴趣,您可能会对我们在TechEmpower基准测试方面的进展感兴趣。回过头来看,您可以看到.NETCore3.1在最新一轮第19轮中的表现相当不错。我们期待着在即将到来的第20轮中看到.NET5.0。当第20轮最终确定并发布时,新的排名将是值得关注的。

在.NET5.0中的改进是许多人共同努力的结果,他们在GitHub上,在世界各地,在多个时区协同工作。感谢为这一版本做出贡献的每一个人。别担心,有很多机会可以贡献自己的力量。NET5.0版本已经结束,但是下一个版本已经开始了。

Net 5.0是另一个大版本,它应该会改进你使用.NET的许多方面。我们已经实现了一系列的改进,从单文件应用程序到性能,从Json序列化的可用性到ARM64的支持。虽然今天可能是您使用.NET5.0的第一天,但我们在微软的产品中运行.NET5.0已经有几个月了。我们相信,它已准备好供您使用、运营您的业务并为您的应用程序提供动力。C#9和F#5中的新语言改进应该会使您的代码更具表现力,更易于编写。对于您现有的应用程序来说,.Net 5.0也是一个很好的选择。在许多情况下,您可以毫不费力地升级。

如果您对性能感兴趣,您可能会对我们在TechEmpower基准测试方面的进展感兴趣。回过头来看,您可以看到.NETCore3.1在最新一轮第19轮中的表现相当不错。我们期待着在即将到来的第20轮中看到.NET5.0。当第20轮最终确定并发布时,新的排名将是值得关注的。

在.NET5.0中的改进是许多人共同努力的结果,他们在GitHub上,在世界各地,在多个时区协同工作。感谢为这一版本做出贡献的每一个人。别担心,有很多机会可以贡献自己的力量。NET5.0版本已经结束,但是下一个版本已经开始了。

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 扫一扫,分享海报

技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18 的算法(C#) 一组 正则表达式 静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C# 2.0会给我们带什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——性能和灵活性兼备的方法 泛型技巧系列:用泛型打造可复用的抽象工厂 泛型技巧系列:如何提供类型参数之间的转换 .NET 2.0 泛型Quiz Visual Studio 2005体验泛型编程 C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-extern C#2.0-可空类型 C#2.0-分部类 C#2.0-迭代器 C#2.0 的新增功能学习 泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup Object Click button only once in asp.net 2.0 Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的组件!(终结MasterPages技术) 在ASP.NET 1.1下实现模板化站点的新思路 在ASP.Net中两种利用CSS实现多界面的方法 用于弹出ModalDialog进行数据选择的控件 使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的MasterPage技术) Tool Tip 示例(FILTER版) Tool Tip示例 (htc版) 一个.net发送HTTP数据实体的类 按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动返回上次请求页面(小技巧) ASP.NET 2.0 控件 ASP.NET 2.0 验证控件新的功能 DataGridView中如何在textbox列中限制输入。 ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) 体验.net2.0的优雅(3) -- 为您的 SiteMap 添加 控制转发功能 GridView控件使用经验 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! ASP.NET2.0控件一览---标准控件(1) ASP.NET2.0控件一览---标准控件(2) ASP.NET 2.0中使用webpart系列控件 ASP.NET 2.0 中实现跨页提交 新控件、管理外观、布局及其它用户体验 ASP.NET 2.0 缓存技术 (原创) asp.net 2.0中的theme主题覆盖问题 asp.net 2.0中利用app_offline.htm功能 .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用小记 2.0问题、错误解决办法 ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0) Server Side ViewState 在服务器端存贮ViewState (ASP.NET 2.0) VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005aspnetdb.mdf部署 ASP.NET 2.0 Security FAQs Asp.net 2.0功能体验,细节之Web控件(一) 隐藏控件 Asp.net 2.0功能体验,总体设计思想 Asp.net 2.0 WebPart使用经验点滴 革新:.NET 2.0的自定义配置文件体系初探 关于如何在ASP.NET 2.0中定制Expression Builders 怎么在ASP.NET 2.0中使用Membership asp.net 2.0-实现数据访问(1) ASP.NET 2.0 新特性 .NET 2.0里使用强类型数据创建多层应用 在MastPage中引用脚本资源 2.0正式版中callback的一些变化+使用示例(ASP.NET 2.0asp.net 2.0 新特性 Visual Web Development 2005开发ASP.NET使用小技巧 ASP.NET 2.0 异步页面原理浅析 [1] [原] 自定义通用System.Web.UI.IHierarchicalDataSource简单实现 在 ASP.NET 2.0 中创建 Web 应用程序主题 ASP.NET 2.0 中的数据访问 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! 将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 Ibatisnet 提供的CacheModel ASP.NET 2.0中小心Profile命名冲突 使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200 [ASP.NET 2.0]PageParser.GetCompiledPageInstance中存在一个Bug 如何在DotNet 2的登录组件中检索用户的锁定状态及解锁? ASP.NET 2.0, 想说爱你不容易 SqlDataSource WEB控件:当DeleteCommandType= 遭遇 ASP.NET 2.0 只读 TextBox 回发后信息丢失的 bug asp.net2.0:扩展ImageButton控件定制自己需要的功能 ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题转换 ASP.NET2.0 ObjectDataSource的使用详解(1) ASP.NET2.0 ObjectDataSource的使用详解(2) TextDataSource(1) — DataSourceControl内幕 TextDataSource(2) — 翠花,上“数据” ASP.NET2.0 ObjectDataSource的使用详解(3) ASP.NET2.0 快速入门 ----默认中的主题外观 数据库开发 ADO.NET 通过DataTable获得表的主键 ADO.NET 2.0 操作实例 ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库访问类 DataTable.Select方法的性能问题 .NET 2.0里使用强类型数据创建多层应用 ADO.NET实用经验无保留曝光 有了System.Data.IDataReader,一切皆成数据 理解DataSet的数据缓存机制 存储过程 可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! 2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) 分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步提交事务(NET2.0) 其它 在.NET访问MySql数据库时的几点经验! 自动代码生成器 关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory3.0完全攻略--简单示例 XCodeFactory3.0完全攻略--IDBAccesser XCodeFactory2.0完全手册(中) XCodeFactory2.0完全手册(上) XCodeFactory3.0Beta1推出 ! SQL Server 2005 SQL Server 2005的几个新功能 在SQL Server 2005中解决死锁 在 SQL Server 2005 中查询表结构及索引 sql server 2005中的DDL触发器 在 SQL Server 2005 中使用表值函数实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在Asp.net中如何用SQLDMO获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取数据库中某个某个表的创建脚本 DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法得到数据库架构信息 用于 Visual Studio .Net 的 IBM DB2 开发外接程序 第2章 并发操作的一致性问题 (2) Using sqlite with .NET Visual Studio 2005 中的新 DataSet 特性 MySQL 和 .Net2.0配合使用 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow ASP.NET中大结果集的分页[翻译] .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库 SQL Server数据库安全规划全攻略 .net通用数据库访问组件SQL Artisan应用简介1 在Framework1.0下同时连接SqlServer和Oracle的一些体会 XML XPath XPath最通俗的教程(ZZ) XPath中相对路径和绝对路径 XPath 简单语法 Asp.Net(C#)利用XPath解析XML文档示例 XSL .Net框架下的XSLT转换技术简介 一个XSLT的简单例子 XSLXSLT板主题整理 xsl入门的好文章 新手学习XSL的好东西 XSL语法介绍 XSL学习心得 - 调用属性值 XSLT与XML转换的详细介绍 功能应用 读写搜索 基础教程 RSS Web2.0时代,RSS你会用了吗?(技术实现总结) 知识集锦:三分钟全面了解 Blog 和 RSS C#+ASP.NET开发基于Web的RSS阅读器 ASP.NET RSS Toolkit(RSS工具) Serialize Your Deck with Positron [XML Serialization, XSD, C#] 如何用RSS技术升级您的网站 RSS技术在行业中的应用三案例 RSS的力量 为自己的网站添加RSS功能 建立自己的RSS asp.netc#+sql生成rss2.0代码 如何获取远程RSS内容? C#如何实现读取RSS VC# 2005 Screen Saver Starter kit里的Rss处理类分析 使用XmlHttp与Javascript实现对RSS的读取 WEB BUILDER中的动态页面生成 WebBulider 中的RSSWebpar — 建立自己的 RSS 阅读器 RSS 2.0规范 C#版简易RSS阅读器(新增读取OPML功能) C#版简易RSS阅读器 asp.net 页面中生成 RSS 2.0 提要 用 Ajax 和 RSS 攒个首页新闻 用RSS整合内容以满足不同的需要 简单的在线RSS阅读器(原创) 用户自定义配置接点读取 通用方案 利用XmlDocument更新Xml文件中的数据 XML的特征以及一些用途 如何创建一个XML文件,然后创建一个与之关联的样式表文件? Rss为什么会兴起?什么时候会被替代? 遍历指定文件夹下所有的xml文件并动态生成HTML页面 通过XML远程抓娶图片的代码 .Net1.0和2.0下 soap序列化和binary序列化的比较 NET中书写XML的一种简单方法 适用于IE浏览器及非IE浏览器的xmlhttp脚本 用实例说明如何用JavaScript生成XML XML驱动开发 XamlReader.Load(): Build Up Your Own XamlPad 如何理解xslt中模板调用 Web Service 从WEB SERVICE 上返回大数据量的DATASET MSMQ,Enterprise Service, DotNet Remoting,Web Service 的优缺点 动态调用web服务 Web服务最佳实践(翻译) HTTP协议下用Web Service上传大文件的解决方案 与大家分享一些Web Service的经验 Web Service Security --- Introduction XML Web Service 安全性 SOA 设计原则和 Web 服务中的数据传输 解决内网通过代理服务器访问外网部署WebService报错问题“请求因 HTTP 状态 407 失败” 对象与状态 Application Session 如何得到Sessionid的值 Session研习笔记 Cookie cookie 学习总结 ViewState ASP.NET 小技巧:重写 ViewState 的存储目的地,以提高页面性能 由重写ViewState存储目的而想到的 [总结]关于在线用户列表的统计! Persistent Strategy (1) - 问题定义与实现 Persistent Strategy (2) - Xml序列化的应用 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆 控件 DataGrid 简单实用的DATAGRID组件 为DataGrid创建自定义列控件(二) 为DataGrid创建自定义列控件(一) 为DataGrid创建自定义列控件(三) 在ASP.NET环境下完整的datagrid填充数据后界面动态显示填充方案 在dataGrid中拖动改变列宽度,在asp.net中 用javascript实现dataGrid表头排序 存储过程DataGrid分页及注意点 在后代码里创建DataGrid控件 为DataGrid自定义分页添加自定义导航和分页信息 如何利用DataGrid纵向显示数据? 如何用DataGrid实现类似DataList多列的效果 竖表转横表(支持多列) 竖表变横表(支持固定列) 通用分页控件(DataGrid,DataList,Repeater都可以用它分页) 如何同时选择DataGrid的多行 DataGrid单元格移动变色,点击变色,双击取消颜色,排序. 分页管理器实现 oButton加入DataGrid模板列引起的问题。 将RadioButton加入到DataGrid模板列后单选简单实现 用c#实现将DataGrid中的数据导为microsoft office excel 2003 TreeView ASP.NET环境下完整的treeview使用类 C#加javaScripts实现选中树节点后显示节点内容(微软TreeView) treeview 的使用心得 FlyTreeView for ASP.NET 3.2 破解攻略 用Ajax技术让IE Web Control Tree View实现大数据量读取 我在使用C#中Treeview与解析XML遇到的问题! TreeView父子联动效果保持节点状态一致 Asp.Net 2.0 TreeView的Checkbox级联操作 DataList Html控件 table动态改变颜色包括一个边框 功能超强的表格(上下左右移动,添加删除行列,导出) 用户控件开发 ASP.NET 服务器控件授权 为控件添加自定义属性和事件 让你的控件属性注释支持多语言 自定义UserControl的属性为什么不能在设计时显示在属性窗口中 asp .net 服务器控件开发心得 今天你写控件了吗 --Asp.net服务器控件开发系列文章 汇总 将ASP.NET用户控件转化为自定义控件 TextBox 创建具有自验证功能的textbox控件 textbox上实现右键菜单 给FreeTextBox 3.0.5 添加上QQ和MSN表情 FreeTextBox中存在一个严重的安全漏洞 DOTNET2.0 的编辑器:WebHtmlEditor 1.5 Release提供在线演示和下载 FreeTextBox使用详解 (版本3.1.1) 弹出式选择文本控件 ASP.NET: Custom AutoCompleteTextBox WebControl [With Source Code] Button 水晶报表 水晶报表数据填充(一种推模式,两种拉模式)类库 RDLC报表(一) RDLC报表(二) 其他控件 让asp.net默认的上传组件支持进度条反映 HtmlTextWriter学习笔记 用户控件例码 ASP.net下的前台日历控件源代码(不刷新页面) ASP.net下DataGrid的单项选择控件 个ASP.Net的DataGrid分页控件,在Oracle数据库下,每次只取当前页的数据,不使用存储过程 自动获取当前日期下一周的年月日代码 asp.net下的日历控件源代码 写了一个live.com的Gadget——农历日历 令你心动的Asp.net 开发中的MessageBox控件 WebForm的MessageBox类 复合控件开发系列之一 年月日三联动下拉框 下拉日期控件 客户端计时器控件(clientTimer)的c#源码 在线考试系统中卷面计时的一点思考 GridView GridView 控件使用不完全指南! GridView 控件使用不完全指南!(续一) ASP.NET2.0中Gridview中数据操作技巧 一套可嵌入或独立使用的翻页控件: WebPager(附源码) Web进度条的简单方案 ComponentArt WebUI3.0控件使用方法 在ASP.NET页面中使用SolpartMenu控件 共享两个做项目最常用功能操作的封装类 国内报表设计器的分析 基于Ajax的日期控件 缓存服务与性能优化 通过系统配置提高ASP.NET应用程序的稳定性 通过系统配置提高ASP.NET应用程序的稳定性(续) 异步加载图片,提高HTML性能 负载均衡环境下缓存处理 网站速度优化模块HttpCompressionModule [连载]Tuning .NET Performance [连载]Tuning .NET Performance [连载]Tuning .NET Performance 连载]Tuning .NET Performance 安全与验证 加密解密 使用证书做RSA非对称式加密 自已做的一个加密软件,超好用而且加密强度极高,公布源码 身份权限审核 使用URL参数+Controls层实现网站用户权限管理 系统分析中大家是怎样设计系统的多级权限控制的?? 多级权限设置请教。 基于角色的权限控制 AspNetForums中基于角色的权限控制 asp.net页面如何控制页面依据不同用户权限有不可见、可见、编辑 三种操作权限? 请问在SmartClient应用中,如何做到科学的身份验证和权限分配?~~UP有分 做过权限管理和想做权限管理的人进(附我的思路) 关于权限设计的探讨 Asp.net中基于Forms验证的角色验证授权 用户权限系统设计方案 权限控制系统的设计 统一用户及权限管理系统 权限系统:分散实现、关注变化 关于权限管理的系统的构思 EsbAOP应用--权限管理 asp.net能实现身份认证的EMAIL发送方法(c#版本) 单点登录(SSO)的核心--kerberos身份认证协议技术参考(一) 单点登录(SSO)的核心--kerberos身份认证协议技术参考(二) 单点登录(SSO)的核心--kerberos身份认证协议技术参考(三) 权限系统概要(收集,整理) membership,想说爱你不容易 蛙蛙推荐:web下的授权简单解决方案 将权限引入系统的探索 数据库有效验证 浅谈在ASP.NET中数据有效性校验的方法 XML Schema Validator Class JSClientValidator-客户端javascript验证新模式 如果做到安全的系统之验证用户输入. 部署安全 查看贴子内容 CLI里面的秘密……(二)强命名、元数据以及文件结构(上半部分) Assembly学习心得 asp.net 保护网站不受用户上传文件的侵害 在设置窗体身份验证时设置个别页面不需要进行验证 基于Web应用程序的安全问题之一Cross-Site Scripting Vulnerabilities 代码安全 基于强名称签名的代码访问保护及其改进 防止对 Visual Basic .NETC# 代码进行反相工程 如何防止 DLL 被反编译 揭开.NET程序保护的秘密 如何建立有效的.Net软件注册保护机制 由浅至深,谈谈.NET混淆原理 (一) 由浅至深,谈谈.NET混淆原理 (二) 最简单的混淆 由浅至深 谈谈.NET混淆原理(三)-- 流程混淆 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇) 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法) 看了下面那篇“Crack别人应用程序”的文章有感,简述.Net下的应用程序授权。 vs2003中设计强名称程序集并制作安装入GAC的MSI 无法破解的软件注册码算法 保护你的代码——谁动了我的组件? ASP.NET中的单点登录 Cookie 支持二级域名和FormsAuthentication 加强版 论电子签章(Electronic Signature)在C#中的实现方法 使用IHttpHandler防止非法链接 使用 Ildasm, ILasm, Peverify Crack 别人写的应用程序。 ASP.NET2.0应用中定制安全凭证之实践篇 创建安全的ASP.NET虚拟主机 实现关于跨二级域名和1.1和2.0.net Forms身份验证体制的问题和解决办法. Kerberos简介 在ASP.NET中防止注入攻击[翻译] 封装了一个极其易用的加密解密类,支持DES、三重DES、Rijndael、RC2、MD5、以及非对称加密算法RSA 学习一下 .net framework 中有关安全的内容 学习一下 .net framework 中有关安全的内容(续) 环境配置与部属 使用ASP.NET的跟踪服务 无ASPX文件部署(续) 无aspx文件部署 aspx->cs->dll 如何把用http访问的网页转换用https访问 一个配置IIS的问题 在Apache环境下成功的运行ASP.NET 关于通用配置管理模块的思考-续(用XmlDocument 还是DataSet) 在.net中使用强类型读取配置信息 Asp.net网站的ClickOnce自动部署(1)-自动部署的内容 Asp.net网站的ClickOnce自动部署(2)-虚拟目录的配置 Asp.net网站的ClickOnce自动部署(3)-虚拟目录的配置 web.config文件自定义配置节的使用方法 模仿AppSettings进行web.config的自定义节读取[简单实用型] 关于无aspx文件部署,我的一些探索心得 .NET配置文件解析过程详解(二) Asynchronous Pluggable Protocols Microsoft CRM3.0 多服务器安装部署过程 解决w3wp.exe内存占用问题 实战1.1下Web.Config配置标记configSections 系统设计与项目管理 系统设计 分层开发思想与小笼包 N层企业级架构模板 系统设计的一些原则 在UI层使用Domain逻辑的一些探讨 在C#程序中实现插件架构 组件设计实战--组件之间的关系 (Event、依赖倒置、Bridge) 逻辑设计的例子 一个.net的系统的AOP设计思路一——NHibernate和界面/对象映射层 设计和编写可复用的代码 基于工作流程系统日志生成业务流程模型 SVG + Javascript + ASP.NET + WebService开发楼宇管理系统(一) 系统分析员,让我头痛 .NET下的域对象持久模式 业务流程管理综述 动态工作流的设计 提升软件的用户体验 应用软件的合理性 架构(Architecture)和框架(Framework)杂谈 小议模型 再议模型 软件设计评价 软件设计评价(续) 理解架构师 架构师不是建筑师 MDA(模型驱动架构) 家庭财务总管--软件设计 应用系统架构设计-补全篇 对Web平台和软件架构的一些看法 关于多层设计想到的问题-涉及Nhibernate和Log4Net 谁拥有接口? Codd提出的RDBMS的12项准则 一个糟糕的设计 业务系统里面常见的方法接口设计 将UI和UI控制分离 DotNet软件开发框架 细节决定成败:业务拦截器 广告管理系统的UML分析与设计 软件的架构设计 框架不是框框—应用框架的基本思想 创建成功的工程 软件可行性分析 GIS系统与一个好的软件架构,Why not and how? 直观而简单的解决方案--软件设计的永恒追求 企业开发基础设施--序 企业开发基础设施--类厂服务 企业开发基础设施--事件通知服务 面向对象 基于Visual C#的接口基础教程 基于C#的接口基础教程之一 基于C#的接口基础教程之二 基于C#的接口基础教程之三 基于C#的接口基础教程之四 基于C#的接口基础教程之五 基于C#的接口基础教程之六 基于C#的接口基础教程之七 小结 一个代理的例子 关于委托事件的一两个很好的例子! 依赖倒置 细说继承关系映射 面向对象与面向组件小议 C#中接口多重继承的注意事项 [ASP.NET入门随想四]吸星大法——页面的OO思想篇 如何在类中编写事件 OOD经验原则总结 [ASP.NET入门随想六]大航海家——OO思想的类间关系 接口跟基类的一点点感受 [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托 Win32中安全的子类化 (1) Emit生成Property C#中类和接口的设计思想 数据库设计 数据库设计指南 使用Rose2003进行数据库建模并导入SQLServer2000的图解详细过程 UML 聚合 的概念 UML视图 静态视图 构件图 包图 初学uml-(1) 类图和关系 UML学习-通过用例分析确认需求 国际化组件的设计 Web应用的UML建模与.NET框架开发 基于UML的短信计费系统的分析与设计 基于UML的系统分析方法研究 UML的三大“硬伤” 系统约定:用UML描述工作流管理 使用Rose2003进行数据库建模并导入SQLServer2000的图解详细过程 文档 项目开发总结报告 方案设计书 系统规格/需求规格说明/概要设计书范例 “一卡通”信息系统数据库设计初步探讨(原创) 某M1射频卡餐饮收费系统简单数据模型 广告发布统计实现的可行性分析阶段报告 应用软件部2005年年度工作总结 CPMS企业绩效考核管理系统 V1.1 介绍 设计模式 吕震宇设计模式随笔系列 C#设计模式(1) C#设计模式(2) C#设计模式(3) C#设计模式(4)-Simple Factory C#设计模式(5)-Factory Method Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(7)-Singleton Pattern C#设计模式(8)-Builder Pattern C#设计模式(9)-Prototype Pattern C#设计模式(10)-Adapter Pattern C#设计模式(11)-Composite Pattern C#设计模式(12)-Decorator Pattern C#设计模式(13)-Proxy Pattern 设计模式(14)-Flyweight Pattern 设计模式(15)-Facade Pattern 设计模式(16)-Bridge Pattern 设计模式(17)-Chain of Responsibility Pattern 设计模式(18)-Command Pattern 设计模式(19)-Observer Pattern 设计模式(20)-Visitor Pattern 设计模式(21)-Template Method Pattern 设计模式(22)-Strategy Pattern 设计模式随笔-蜡笔与毛笔的故事 设计模式随笔-从“有病”说起(工厂模式前传) 设计模式随笔-发大米 设计模式随笔-锦囊妙计 设计模式随笔-让众口不再难调 设计模式随笔-用奶箱订报纸 设计模式随笔-再论锦囊妙计 也说说“从Adapter模式到Decorator模式” 梦幻.Net设计模式 Dot Net设计模式—桥接模式 如何在实际工作中发现模式 设计模式能够解决的问题 设计模式不能做什么 Dot NET设计模式—抽象工厂 Dot NET设计模式—反射工厂 Dot Net 设计模式—简单工厂 Dot Net设计模式—工厂方法模式 Dot Net设计模式—生成器模式 Dot Net设计模式—原型模式 如何掌握并在实践中自如运用设计模式 Dot Net设计模式—单件模式 Dot Net设计模式—适配器模式 Dot Net设计模式—外观模式 Dot Net设计模式—适配器、桥接与外观三模式之间的关系 .NET反射、委托技术与设计模式 创建型模式之间的比较 用实例解说Dot Net设计模式——装饰模式 New Folder 设计模式原型模式(Prototype)- 面馆里的菜单 程序员的时间管理---做一个高效的程序员 设计模式-工厂模式(手工作坊到工业化的转变 c#实现) 设计模式-简单工厂模式(SimpleFactory-C#) 设计模式学习笔记(一) Terrylee 探索设计模式(五):工厂方法模式(Factory Method) 探索设计模式(1):开篇 探索设计模式(2):深入浅出单件模式(Sigleton Pattern) 探索设计模式(3):抽象工厂模式新解(Abstract Factory) 探索设计模式(4):建造者模式过程图解(Builder Pattern) 探索设计模式(六):原型模式(Prototype Pattern) 探索设计模式(七):创建型模式专题总结(Creational Pattern) 探索设计模式(九):桥接模式(Bridge Pattern) 探索设计模式(八):适配器模式(Adapter Pattern) 探索设计模式(11):组合模式(Composite Pattern) .NET设计模式(13):享元模式(Flyweight Pattern) Head First Design Patterns(深入浅出设计模式 Head First Design Patterns(深入浅出设计模式)-目录 Head First Design Patterns(深入浅出设计模式)-设计模式介绍 你真的了解Ioc与AOP吗? Spring.Net 示例代码分析 乱改:Visitor经典模式改进1 乱评:《c#设计模式》中的“访问者模式” 软件的架构与设计模式之模式的种类 Ioc模式(又称DI:Dependency Injection) 隐藏在.NET中的IoC? 一步一步开发Spring Framework MVC应用程序 CSharp面向对象设计模式纵横谈--Singleton Pattern 听课笔记 CSharp面向对象设计模式纵横谈--面向对象设计模式与原则 听课笔记 最少职责OOD设计手段 OOD的设计手段总结 面向对象设计的六大原则简介 由浅入深学“工厂模式”(1) 由浅入深学“工厂模式”(2) A Taste of AOP from Solving Problems with OOP and Design Patterns (Part I) A Taste of AOP from Solving Problems with OOP and Design Patterns (Part II) A Taste of AOP from Solving Problems with OOP and Design Patterns (Part III) 与大虾对话: 领悟设计模式 Design&Pattern团队《设计模式在软件开发的应用》精华版 由浅入深学“工厂模式”(3) 简话设计模式 观察者模式 (using .net) C#中事件与观察者模式 Role分析模式(一) 角色对象基本概念 Role分析模式(二)角色对象创建和管理 在开发中体验设计模式 重新诠释AOP 侃中介者模式(Mediator) 采用AOP 的观点 Log 所有方法的调用 MS 的IOC容器(ObjectBuilder)? .Net event vs. observer Pattern DProxy介绍 – 一种高性能轻量级AOP开发组件(.NET 1.1) JavaScript中的Decorator模式 魔法牌里的模式(Bridge) 决策者得选择(Strategy) 通讯兵(Chain of Responsibility) 面向智能体编程(Agent Oriented Programmig, AOP)一些体会 Bridge? 一个GIS二次开发中常用的设计模式 Switch语句,僵化的毒药 策略模式的应用实践 重读GoF Factory Method实现数据库操作的类 用Factory Method模式扩展MyMSDNTVLibrary 工厂模式和容器模式的探索 反编译 Component重要类,全文解释 - 容器篇 单系统多类型数据源随意切换的c#实现 用C#实现MVC(Model View Control)模式介绍 小议.NET中的对象拷贝 设计模式原则详解 封装变化(一) AOP的纯.Net实现 使用纯.net实现AOP(加入了比较详细的代码说明) 隐身大法,使民无知 设计模式浅析之Singleton 设计模式Top10排行榜 简话设计模式 在我们使用的NET FRAMEWORK类库中发现设计模式(3) 在我们使用的NET FRAMEWORK类库中发现设计模式(2) New Article 模版模式 Template Pattern — 穷人和富人的不同婚恋历程 发掘模式---今天您发掘拉mei? 老师讲的抽象工厂,错了一点点 Singleton + Proxy 模式+AOP Observer模式为何要区分推拉模式 也谈谈工厂模式 项目管理 需求分析控制 项目经理 七个关于有效沟通的哲理故事 新主管如何生存? 怎样从一名程序员过度到项目经理 论《金瓶梅》与项目管理中人际关系协调 做项目经理的一些思考 怎样从一名程序员过度到项目经理 什么是项目经理 团队建设 软件项目中的人员管理和团队建设 建立“杀手”开发团队 软件开发组的团队精神 如何指导软件开发新手 改变一个状况不佳的项目组 论软件开发中的三种重要角色 如何调动员工的积极性 成功项目团队中应树立的五种意识 管理观点系列:团队管理 现在有多同事工作较懒散,没有一点工作效率,开发出的东西,Bug又多。如果让你管理你会怎么做? 人才的识与用 用人之道 高效团队的速成之道 管理人员如何有效应用表扬与批评进行反馈 [项目管理]管理中的人 [团队管理]+[软件人生]从项目计划到保密管理到个人学习与提高的方法 建立团队精神 你实现团队管理了吗? 需求管理 怎么做需求分析 撰写优秀的需求 需求分析的20条法则 从用户接触到完成需求说明书 需求调研步骤和方法 一种界面需求分析方法 细谈软件需求分析过程:提取、抽象、升华 网站项目管理-如何做好需求分析 如何写系统分析书 客户需求何时休? 软件需求管理-用例方法,读书摘要 [理解需求变更之一]说说需求变更的必然 RUP简介 软件开发过程中最重要的是人?还是领导者? 开贴讨论:我观察国内几乎所有公司都有这样或者那样的管理问题,开贴讨论:小团队web项目负责人的工作办法 技术不是全部,归纳和演绎能力也很重要 谈恋爱与IT项目管理 广为流传的一个关于项目管理的通俗讲解 诸子百家与项目管理 之 序 诸子百家与项目管理 之 总述 问答 诸子百家与项目管理 之 周易篇(项目管理的两个基本点) 诸子百家与项目管理 之 孙子兵法篇(项目管理的整体思维) 实战解析----项目目的和范围 项目管理过程中的棘轮效应 任务管理 项目整体管理 项目风险管理 项目采购管理 项目沟通管理 项目人力资源管理 项目成本管理 项目质量管理 项目时间管理 项目范围管理 编码人员和美工的配合问题 心得体会:关于开发效率和项目周期的问题 紧急项目处理方法 做项目的一些体会(之一)_软件开发过程中我们应当具有的能力 团队技能之一——分析问题 价值高于一切-企业软件开发谈 项目管理之我见(原创) 项目开发管理经验交流 软件实例开发手记(自序)-为保证文章完整性,谢绝对某篇而非全部手记的转载 紧急项目处理方法 浅谈项目管理中的职责权 - [原创] 由一个虚构的例子谈谈中小型研发型项目的技术管理及成本控制(全文) 优化IT企业的基础架构 一个研发经理的项目日记 .net敏捷开发及常用工具 关于项目管理和项目计划制定的对话 微软资深经理人的项目管理经验 WEB项目开发 MyMsn动态Resize页框架的布局详解 性能,安全,集成才是web之道 重构之美-走在Web标准化设计的路上[深入结构:理解h系列的不合理。] 重构之美-走在Web标准化设计的路上[振臂一呼:Css, Stop! ] 重构之美-走在Web标准化设计的路上[复杂表单]3 2 Update 重构之美-走在Web标准化设计的路上[唠叨先] 重构之美-迎接Web标准化设计的临[总结一:网页设计回归?] 重构之美-走在Web标准化设计的路上[对HTML/XHTML/XML/XSL的一些认识] 雅虎网站项目工作流程 微软资深经理人的网站项目管理经验 其它 软件工程 一个测试的重构 RUP 核心概念 配置管理的概念 RUP && MSF 特点 构建面向对象的应用软件系统框架 构建面向对象的应用软件系统框架 目录 构建面向对象的应用软件系统框架 第1章 构建面向对象的应用软件系统框架 第2章 第3章 数据和对象 第4章 O/R Mapping的一般做法 第5章 设计一个O/R Mapping框架 第6章 面向方面编程 第7章 接口 第8章 事务处理 第9章 性能优化 第10章 界面层的功能划分 第11章 界面设计模式 第12章 动态代码生成和编译技术 第13章 远程过程访问的客户端整合 第14章 智能客户端 第15章 简述 Effective Coding - Readability 单元测试时的一些最佳实践 Best free tools/frameworks/libraries I use 统一界面设计 十二种实践方法与我的XP心得 使用CVS做.NET项目 在asp.net页面上得到Castle容器的实例 当前软件开发的反思 面向对象设计,ORM,NHIBERNATE杂谈(有感) 投标方案应该怎么写? CMM/CMMI将带我们走向何方——一个CMM从业人员的反思 对一个排序程序的不断重构 FxCop 设计规则 敏捷实践12 条原则 《敏捷软件开发》读书笔记 (1) 《敏捷软件开发》读书笔记 (2) -- 设计原则 《重构》 读书笔记 (1) 企业应用之领域模型 我的.net项目经验(一)。 也谈 SOA 重新诠释SOA 登山的程序员(极限与敏捷之一) 敏捷的总设计师(极限与敏捷之二) 实战解析--项目的主要技术储备 产品升级策略 读《DTS分析模型、设计模型》有感 软件开发核心工作流程 新产品研发 分析设计过程.rar 在小型项目中使用 IBM Rational Unified Process: 极限编程剖析(转) 一点反射,再一点Emit —— 极度简化Entity! 软件整合--硬件整合--平台整合 用自定义KeyValueCollection类代替Dictionary/Hastable,改善简化后的Entity性能 Java剑 VS .NET刀 -- 东山再起(论模式)(二)【推荐】 基于构件技术的需求管理过程-框架需求调研 PSP课程(一): PSP简介 我对系统重构的理解 重构---Who are you?! 单元测试应该测什么,不应该测什么? AccEAP架构介绍(1)---实体的设计 我的单元测试认识之路 中小型MIS开发之我见(一)---开发阶段 中小型MIS开发之我见(二)---具体实施(上) 中小型MIS开发之我见(二)---具体实施(下) 团队开发框架(Developement Structure for Team),内容列表及整理计划 风继续吹----对一些ORM框架的使用心得(2) 冷眼程序人生----对一些ORM框架的使用心得 读书笔记]-道法自然之需求分析 个人对软件开发的思考 网络应用 一个Udp信息收发静态类! [修改]脚本判断网站是否能打开 IIS防止文件下载完全手册(非更改文件名法) 在.NET中利用XMLHTTP下载文件 开发 .NET 下的 FTP 客户端组件 如何不让没有登录的用户下载的问题 文件下载时如何隐藏实际地址? ASP.NET 多文件上传 .net 中发mail到hotmail中乱码问题的解决 郁闷的OpenPOP的MIME Parser Asp.net(c#)实现多线程断点续传 关于 OpenSmtp 邮件标题过长后出现乱码问题的解决 支付宝Payto接口的c#.net实现 文件操作 发布一个Asp.Net文件夹复制类 关于File的一些例子 文件操作工具类 FileUtility 大文件上传之异常处理(原创) 文件 在线压缩 技术 ASP.NET在线压缩与在线解压缩 c#文件操作(二) 在ASP.NET中跟踪和恢复大文件下载 Response.BinaryWrite()下载时文件名的问题. Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流) DotNet 序列化学习笔记 一个上传的类 系统控制 WMI类--所有可用的WMI的类封装 用ActiveX控件和JavaScript脚本实现基于Web的票据套打(源码下载) 运用API函数获取系统信息 通过ASP.NET页面重启服务器 开源:VS.NET打印思想与2003/5DataGrid、DataGridView及二维数据如ListView等终极打印实现(全部源码) 关于如何打印ListView的解决方法 修改IIS目录的Asp.Net版本 如何获取客户IE统计信息[代码] 图像多媒体 js图形报表 一个可设置背景图片的验证码图片的生成方法 图片翻页幻灯效果 图片渐变轮换效果 讨论一下flash.ocx(8.0版本的)与.net结合的编程 动态生成缩略图 SharpMap介绍及源码分析 利用Javascript 结合 VML 生成三维报表(饼图) 技巧与总结 代码阅读总结(个人总结开发小技巧) DotNet精美书籍大检阅 asp.net的页面代码组织模式 金鼎俱乐部项目总结 总结一下散乱的开发点滴(3) (高手勿入) 说的都是概念——有关编程范式 组织一些开源项目 VS.NET操作技巧 Visual SourceSafe VSS信息的读取的操作 安装程序 安装程序自动安装数据库 程序安装时检查是否已经安装.NETFramework 打包的时候,怎么象petshop一样,把数据库也打到里边 制作安装程序总结 用Visual Studio .Net 2003制作安装程序时轻松实现将自己的程序添加到系统的鼠标右键菜单 .net打包自动安装数据库 用自删除dll实现应用程序的安装/卸载代码 .NET打包自动安装数据库 调试常见问题 IE安装了flash插件还不能显示swf动画的问题 让人哭笑不得的“Unable to load one or more of the types in the assembly”问题的解决! 关于异常处理的一点感受 项目调试时候,出现其中用到的一个组件“访问被拒绝”的解决方法。 对于引用的控件被拒绝访问的解决办法的补充(续) 对于引用的控件被拒绝访问的解决办法的补充(续++)++ 对于引用的控件被拒绝访问的解决办法的补充(续++) 使用Visual Studio.net调试javascript最方便的方法 在Apache上调试Asp.net 1.1/2.0代码 VS.NET 2005 vs.net 2005 中自定义模版项 自己动手打造Visual Studio 2005 Team Suite 正式汉化版 用Visual Studio 2005创建宏代码生成器 Visual Studio 2005 Team Foundation Server Beta3 安装手记 Visual Studio 2005 Team System的BUG? 对vs2005生成dll文件的一点疑惑 开发VS2005下ComboBoxTreeView(下拉列表框弹出树) 与ToolStripComboBoxTreeView(下拉列表框工具条弹出树) Visual Studio 2005中编译调试新功能 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码 在VS.NET2005中使用java代码段以及SOL文件格式的解析 ClubWEBSite starter kit二次开发及Vs2005中ObjectDataSource控件的应用小记 Visual Studio 2005 RTM的奇怪问题 Team Foundation Server Beta3 安装指南 VS2005中通过code snippet定制类模板 C#2.0 Singleton 的实现 Dataset+TableAdapter _.net最终数据访问类出现? 我的心血显然被藐视了 目前发现的 asp.net数据绑定的几个BUG(不定期连载) 使用GDI+在VS2005下开发基于DataGridView的财务显示单元格控件 目前发现的VS2005 asp.net 数据绑定bug (二) -关于ObjectDatasource 和TableAdapter Use Whidbey Beta2 to target .NET Runtime 1.1 Targetting 1.1 .NET Framework with MSBuild 安装TFS vs.net 2005中web.config智能感知丢失时 VS2005中用Code Snippets提高开发效率 VS2005运行速度优化心得 vs2005 的WebSite 的开发方式的替代Visual Studio Web Application Projects VS2005如何进行单元测试. 善用免费的Code Snippet Libraries加快你的开发速度 Code Snippet Libraries压缩下载包 Visual Studio 2005 Web Application项目RC发布 Visual Studio 2005 Web Application Projects 项目Cool的地方 VS2005将支持的两种WEB编程模型的比较 VS.NET 工具 CodeSmith 我的用CodeSmith生成的业务对象 CodeSmith基础(一) CodeSmith基础(二) CodeSmith基础(三) CodeSmith基础(四) CodeSmith基础(五) CodeSmith基础(六) CodeSmith基础(七) CodeSmith基础(八) CodeSmith应用(一) CodeSmith应用(二) CodeSmith应用(三) CodeSmith应用(四):实现选择路径对话框 CodeSmith-Terrylee CodeSmith实用技巧(一):使用StringCollection 数据库字段属性配置工具界面[用于代码生成] Sharpdevelop2.0预览版放出了 对nunit很失望 Resharper的快捷键 ReSharper 利用Together For VS.NET检查所编写的代码是否够规范 如何用CodeSmith减少代码重复编写 NET 的Refletion的初步了解 VS2005 Add-in:CSS Properties Window 每个开发人员现在应该下载的十种必备工具 体验ReSharper V1.0 for VS.Net 2003 - Part I 用DNS、IIS实现Web项目团队协作开发! 创建自定义的Visual Studio项模板 Microsoft Windows Workflow Foundation 入门:开发人员演练 将asp.net1.1的应用程序升级到asp.net2.0的一点心得 自动填写版权信息 .Net1.x转换为.Net 2.0要注意的几个问题 服务器同时存在1.1和2.0程序注意事项 使用@Page指令的Src 属性 简化对老版本的 asp.net程序的维护 常见的 Web 项目转换问题及解决方案 将 Web 项目从 Visual Studio .Net 2002/2003 转换到 Visual Studio 2005 的分步指南 常见的 ASP.NET 2.0 转换问题和解决方案 你的.net 2.0 真的能与1.1 安全正确地运行在同一台电脑上吗? 小心Server Application Unavailable 错误 安装vsts:如何卸载SQL Server 2005 其他新技术 反射 初识.net反射技术 .NET反射、委托技术与设计模式 .net反射技术的应用—如何调用Java的COM接口 灵活正确的实现.NET插件机制 C#中使用反射的性能分析 论.NET反射、委托技术与设计模式关系 Ajax 用Ajax技术让IE Web Control Tree View实现大数据量读取 AJAX设计模式 之 怎样构建一个可刷新的无刷新应用 AJAX设计模式实践 之 可刷新Ajax应用范例+Framework 在ASP.NET中实现AJAX Ajax.Net的onLoading及aspx页面的默认名字空间及ajaxpro的google组怎么没有一个chinese? CuteEditor5.0的安装及它与Ajax.net配合无刷新操作数据库! 使用简单的Ajax Framework -MagicAjax.NET 剖析MagicAjax 利用AJAX技术开发应用程序实战 基于Ajax的五子棋演示 AJAX页面XMLHTTP对象生成及下一步技术研究 到了该讨论XMLHTTP在Ajax中作用的时候... Ajax,纠正错误,又向前一小步 Ajax, 想得更实际一些 Ajax, 使用PostBack响应模型和Web控件资源, 让服务器返回更少的数据 几句话介绍MagicAjax 使用MagicAjax 实现无刷新Webparts AJAX编写用户注册实例及技术小结 Web 2.0中AJAX技术应用详解 一个要钱的ajax框架zumipage 网站的推广之痛-使用AJAX和.NET网站的朋友注意了 让MagicAjax支持中文! 阿特拉斯神(二) AJAX急速狂飙:开发www.99scj.com体验(1) ASP.NET 调味品:AJAX 一套使用简单的Ajax服务器控件-Anthem.NET Introduction to Anthem.NET 三种Ajax框架使用比较 Ajax基本原理讲解 【AjaxPro实现机制浅析二】*.ashx文件是怎么的? 利用Ajax与数据岛实现无刷新绑定 应用Ajax.netAsp.net中实现无aspx文件应用 Atlas 用Atlas实现一个基于AJAX的无刷新Chatroom Atlas Table Layout Template 学习Atlas是发现的几个小问题 Atlas笔记1:介绍和调用WebService的方法 Atlas是什么? Atlas 实现机制浅析 [1] Atlas 实现机制浅析 [3] 使用ASP.NET Atlas编写显示真实进度的ProgressBar(进度条)控件 Atlas应用程序调试技巧 在Atlas服务器端实现中推荐使用Web Service而不是Page Method Atlas揭秘 —— 绑定(Binding) 在ASP.NET Atlas中创建自定义的Transformer 在ASP.NET Atlas中创建自定义的Validator 使用ASP.NET Atlas ItemView控件显示集合中的单个数据 使用ASP.NET Atlas ListView控件显示列表数据 调试Atlas客户端JavaScript脚本 在ASP.NET Atlas中创建自定义的Behavior 使用ASP.NET Atlas SortBehavior实现客户端排序 在Atlas中实现检测postback progress的状态的方法 使用ASP.NET Atlas XSLTView控件用XSLT修饰并显示XML数据 Remoting 一步一步学Remoting之一:从简单开始 初识用.NET Remoting开发分布式应用 使用.NET Remoting开发分布式应用——配置文件篇 基于消息与.Net Remoting的分布式处理架构 使用.NET Remoting开发分布式应用——基于租约的生存期 Remoting多个信道(Chennel)的注册问题 Remoting中的线程与网络通信内幕初探 Remoting Event 远程事件 Remoting Discussion(二) Remoting Discussion(三) 移动开发 在PPC上用时间做唯一编号遇到的问题及其解决方法 正确处理 SqlCeException 的方法 通过ActiveSync使你的Windows Mobile Emulator连接到Internet Pocket PC 2003编程环境 Windows Mobile开发环境搭建指南 短信任务源程序分享[.NET CF C#] 循序渐进:使用 Visual Studio 2005 为基于 Windows Mobile 的设备生成 .NET Compact Framework 应用程序 是不是.net compact framework的Bug呢? 窗体切换中的小技巧 Web 2.0 WEB2.0商业模式才刚开始 用Blog和Wiki搭建IT团队的知识库 论web2.0的定义及web2.0盈利的实现方式 MagicAjax-NoStore,Session,Cache模式的区别 Wiki的介绍 wiki、Blog与项目知识管理 wiki的龙去脉与企业应用 2006年 Web 2.0 将面临的10个问题 web 2.0 精彩语录 创新的媒介:Web 2.0三大营销变革 2005年Web 2.0领域涌现的11大高质量软件 学习冲电 <> Go back什么是Web 2.0? Web 2.0时代,你属于哪一份子? 全面精通Web 2.0,做互联网潮头人 项目Wiki的选择和配置 2005年 Web2.0 带动的11大软件 最近的asp.net技术demo 通用异常处理框架 在C#中调用WINCE连接PC的程序 GPS定位信息的接收 PDA/GPS检测报告 CnForums和已有系统的整合方案 Community Server技术分析——CS是如何将三个项目整合到一起的 Microsoft.mshtml到底是什么? BI与CRM深入行业应用 纯粹B/S方式实现InfoPath的设计和运行时--Web Builder WebBuilder 界面一览 大话 .NET/MONO 跨平台应用 移植 ASP.net 项目到 Mono 的问题报告 激动的一天 MONO - .NET跨平台之亲身经历(一) 使用Updater Application Block实现自动更新例子 Component/Service Oriented Software System Development Thinking Smart Client Case Study Source Code Download from MSDN China 初探YAML 在将WEBPART打包成*.CAB包和*.MSI安装包后,竟然无法将其安装到指定的WSS网站 Microsoft Windows Workflow Foundation 入门:开发人员演练 如何让ClickOnce进行手动更新(含代码) WEB BUILDER中的动态页面生成 flash与asp.net通信(LoadVars类) EsbAOP应用--异常关闭器 EnterpriseServerBase的AOP--EsbAOP实现 [WPF]WPF中如何实现数据与表示分离。(一) —— XAML 翻译:微软是如何输掉API之战(上) 微软是如何输掉API之战(下) Log4Net五步走 Agile Framework功能介绍(1):自动事件连接 基于构件技术的软件工程 - Small Team Practice小型团队项目实践标准 RIA全程追踪-引子 Boo简介及无关的一些牢骚 企业应用之领域模型 企业应用之数据持久化方案 通过Spring.net使用XCodeFactory生成的数据层! 关于SNS规则引擎的一点想法 Biztalk2004 Decoder的二次开发----春田花花幼稚园的信息化项目 虚拟社会,做尽天下业务(集思广义,以求大同) ORM新实现——Dali 使用Microsoft Systems Management Server 2.0 进行补丁管理 CNN评出25个典型的下一代互联网公司 SQL Server Report Services 的RS数据库移植到另外一台服务器,报“rsReportServerNotActivated”错误 .NET和JAVA的跨平台,我们很期望.但是容易吗 LoadRunner 架构概览 关于Flex、Jrun、ColdFusion、IIS、ASP.Net结合使用的误区!(只说Flex1.5版本) Windows Communication Foundation入门(Part One) office 操作 ADO.NET(OleDb)读取Excel表格时的一个BUG Office with .Net 系列之 ――― 在自己的程序中宿主Office Office with .Net (二) ――― 使用.Net访问Office编程接口 Office with .Net(二)之外传―――“彻底干净的”关闭Office程序 我写的Asp.net操作Excel的一个类库ExcelHelper(源码下载) C#操作Excel,套用模板并对数据进行分页 关于ASP.NET中调用Excel组件不能结束进程的解决方法 用完Excel组件后 如何彻底关闭Excel进程 一个Excel exporter的组件 web 下实现文档的可浏览但不可保存 Excel开发:简化工作表中选定区域的操作 开源代码系列之Office文档读写(Excel/Word) 将Exce嵌入你的.Net程序 实例与经典源码 .NET Pet Shop 4 .NET Pet Shop 4: Migrating an ASP.NET 1.1 Application to 2.0 NET Pet Shop 4 .NET Pet Shop 4 关于练习项目的一些背景 基于.NET 2.0的Petshop4正式推出了 PetShop的系统架构设计 Petshop 4 学习 Agile Framework 介绍Agile Framework Agile Framework架构图 利用db4o做中间层数据缓存 关于数据层设计的取舍思考 基于SOA思想的架构设计 框架设计之Castle&CompositeUI容器融合 架构设计之Smart Client 架构设计之离线处理 DotNetNuke DNN 数据访问策略 【译】 快速正确的制作DNN模块数据库安装脚本 DotNetNuke开始支持ASP.NET2.0 DotNetNuke从入门到进阶(1)怎样写自己的模块 DotNetNuke 代码文档 翻译DNN-Documentation-readme.txt DotNetNuke:如何创建自己的模块(FlashPlayer Module) [DNN模块开发]让模块支持“导入”“导出”功能 [DNN模块开发]DNN模块的层次划分 [DNN模块开发]模块的文件结构及命名方法 [DNN模块开发]如何写模块数据库安装脚本 建立单独的解决方案开发DNN模块 [DNN模块开发]快速制作DNN模块安装包 [DNN模块开发]快速正确的制作DNN模块数据库安装脚本 [DNN扩展]将Lion.Web.WebHtmlEditor作为DNN的富文本编辑器(初步实现) [DNN扩展]LionHtmlEditorProvider(v1.0.1) [DNN扩展]LionHtmlEditorProvider(v1.0.2) 最后更新:2005-7-25 [DNN模块开发]如何写dnn文件 [DNN模块开发]分类链接模块终于大功告成了 [DNN扩展]LionHtmlEditorProvider(v1.0.3) [DNN模块开发]分类链接模块V1.1 [DNN模块开发]增强型DNN在线调查模块 [DNN学习所得]如何防止页面中的敏感信息被提取 如何修改DotNetNuke(DNN)中服务条款和隐私说明 利用反射工厂模式支持多数据库访问 DNN中搜索引擎原理——如何获取SearchItem DNN中搜索引擎原理——数据库分析篇 [DNN通用控件]TextEditor [DNN学习所得]SolpartMenu一个相当不错的下拉菜单控件 [DNN功能]列表管理添加中国的省份选择下拉框 [DNN学习所得]CBO——简化从数据库读取数据并实例化对象的有效方法 刚开始学习DNN的一点小经验(二) 全新安装dnn3.1.0 DNN安装模板(DotNetNuke.install) [DNN学习所得]让IE也能实现解压缩功能(提供演示源码下载) DNN核心用户控件——实现页面灵活布局的第一步 DNN的数据访问方式——合理运用模式,提高数据访问的灵活性(有修正) 刚开始学习DNN的一点小经验(一) [DNN学习所得]HttpModule到底是个什么东西 DotNetNuke3研究报告一(安装) 初识DotNetNuke(DNN) 关于DotNetNuke(DNN)的语言问题 DotNetNuke3研究报告二(数据访问) [DNN学习所得]HttpModule到底是个什么东西 DNN文件夹说明 [DNN通用控件]DualListControl介绍 DNN3.2.2安装说明 [DNN 3.2.2] DNN开发中的一些细节(2) DNN开发中的一些细节(1) Flash+xml 在 Dnn系统开发中的应用 DNN开发中的一些细节(3) 开源项目 开源CMS Alfresco 1.0 发布 ArgoUML -- 开源UML 建模工具 应用IBatisNet+Castle进行项目的开发 再论IBatisNet + Castle进行项目的开发 NHibernate VS IbatisNet IBatisNet 之 自动生成主关键字 细节决定成败:一个公共类库 BugTracker.NET 汉化手札 ORM开题篇-Gentle.NET之牛刀小试 使用NHIBERNATE写DAL层的流程和牢骚 Mono 开发 (使用.NET技术的你,绝对不能忽略Mono) .NET开源项目链接 MonoRail - 前期准备 MonoRail - 简介 经典案例介绍 广州市工商局商标管理软件 Duwamish 学习Duwamish7的MSDN说明及相关技术策略 Duwamish7学习笔记(七) Duwamish7学习笔记(六) Duwamish7学习笔记(五) Duwamish7学习笔记(四) Duwamish7学习笔记(三) Duwamish7学习笔记(二) Duwamish7学习笔记(-) NHibernate 使用NHibernateContrib中的Nullables NHibernate文档翻译进度&问题收集(持续更新) NHibernate文档翻译 第3章 持久化类(Persistent Classes) NHibernate文档翻译 第5章 集合类(Collections)映射 NHibernate文档翻译 第6章 关联映射 NHibernate文档翻译 第7章 示例: Parent/Child NHibernate 1.0.1 发布了 NHibernate文档翻译完成 NHibernate文档翻译 第8章 NHibernate缓存(NHibernate.Caches) NHibernate文档翻译 第9章 使用AttributesNHibernate.Mapping.Attributes NHibernate文档翻译 第10章 NHibernate.Tool.hbm2net DDL的NHibernate文档 1.快速起步 NHibernate中DateTime,int,bool空值的处理方法 使用NHibernate进行数据持久层开发的最佳实践 基于NHibernate的三层结构应用程序开发初步 NHibernate.Helper Project NHibernate学习手记(1) - 对象的简单CRUD操作 NHibernate学习手记(6) - 实现one2many/many2one的映射 NHibernate快速指南 NHibernate之1——为什么不用DataSet? NHibernate文档翻译 第1章 体系结构 NHibernate文档翻译 第2章 ISessionFactory配置 NHibernate文档翻译 第4章 O/R Mapping基础 由为什么要学习NHibernate说开去 NHibernate 使用手迹(1st) NHibernate 使用手迹(2nd) NHibernate使用手迹(3rd) 发布:偶写的NHibernate代码生成器 面向对象设计,ORM,NHIBERNATE杂谈(有感) Snake.Net Snake.Net 框架中的ORM(一) (Version 0.2 Beta) Snake.Net 框架中的ORM(二) (Version 0.2 Beta) Snake.Net 框架中的ORM(三) (Version 0.2 Beta) Snake.Net网络通讯模块 序 Snake.Net网络通讯模块 - SMTP(一) Snake.Net网络通讯模块 - POP3(二) Snake.Net网络通讯模块 - IMAP4(三) Snake.Net网络通讯模块 - FTP(四) Snake.Net 框架中的ORM(四) (Version 0.2 Beta) Snake.Net 框架中的ORM(五) (Version 0.2 Beta) QPG平台 编写容易被维护的代码(1) QPG--基本用法介绍 技术篇(1)--QPG容器的基本用法 技术篇(2)--QPG容器的高级用法 技术篇(3)--QPG界面分解方法介绍 技术篇(4)--基于QPG容器的服务扩展 技术篇(5)--QPG数据处理方法 技术篇(6)--大话AOP 实践篇(1)--QPG之“打狗棍法” 思想篇(3)—IT运用模式的轮回 思想篇(2)--归纳和演绎能力也很重要 思想篇(1)--企业需要什么样的人才? 思想篇(完)----跟往事干杯 思想篇(4)---- 实战解析(完)----总结 Enterprise Library Enterprise Library2.0(1):Data Access Application Block学习 Enterprise Library2.0(2):Logging Application Block学习 Enterprise Library2.0中加密数据库连接字符串 Enterprise Library——企业库配置管理应用程序块 Enterprise Library——企业库缓存应用程序块 Enterprise Library Step By Step系列(一):配置应用程序块——入门篇 Enterprise Library Step By Step系列(二):配置应用程序块——进阶篇 Enterprise Library Step By Step系列(三):数据访问程序块——入门篇 Enterprise Library Step By Step系列(四):数据访问程序块——进阶篇 Enterprise Library Step By Step系列(五):安全应用程序块——入门篇 Enterprise Library Step By Step系列(六):安全应用程序块——进阶篇 Enterprise Library Step By Step系列(七):日志和监测应用程序块——入门篇 terprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 Enterprise Library Step By Step系列(九):缓冲应用程序块——入门篇 Enterprise Library Step By Step系列(十):缓冲应用程序块——进阶篇 Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇 Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇 Enterprise Library Step By Step系列(十三):加密应用程序块——入门篇 Enterprise Library Step By Step系列(十四):创建基于消息队列(MSMQ)的异步日志 Enterprise Library Step By Step系列(十五):配置应用程序块——设计篇 Enterprise Library Step By Step系列(十六):使用AppSetting Application Block Composite UI Application Block 学习笔记之Commands Composite UI Application Block学习笔记之Event Broker 使用Updater Application Block实现自动更新例子 使用企业程序库的两点体会 Composite UI Application Block学习笔记之Smart Part 关于在服务器端使用Microsoft Exception Management Application Block Logging application block of Enterprise Library 2.0 TimeStamp of the Logging Application Block in EntLib 2.0 对 Updater Application Block v2的表面行为分析及问题 (一) HTTP Downloader for Updater Application Block 2 ObjectBuilder内功心法之中国特色 一个从网页中提取天气预报信息的程序(附源码) Ilungasoft Framework: 使用视图处理继承关系、Tree结构实体关系映射示例[源码] DataQuicker2快速入门-----存储过程篇 一个ASP.NET2.0的小项目-BLOG Ilungasoft Framework中处理有关联关系的实体 Community Server2.0专注细节一 邮件提醒按钮实现(上) DataQuicker(ORM)中的缓存机制 数据框架DataQuicker2第一个版本开源下载. SVG + Javascript + ASP.NET + WebService开发楼宇管理系统 - 杂记3(完) 新的数据框架DataQuicker2 Walk through Message----春田花花幼稚园的信息化项目(II) SVG + Javascript + ASP.NET + WebSe
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值