23
8

如何在.NET Core3.1使用log4net

0
归档:2022年8月分类:C#和.NET

1、添加log4net程序集

通过nuget添加,可以直接在程序集引用里搜索nuget包安装,也可以通过命令行安装,这里使用命令行:PM> Install-Package log4net

2、添加log4net.config配置文件

创建一个log4net.config文件,保存在项目的根目录:

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>

  <!--File Appender-->
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="main.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="25MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>

  <!--Console appender-->
  <appender name="console" type="log4net.Appender.ManagedColoredConsoleAppender">
    <mapping>
      <level value="INFO" />
      <forecolor value="Green" />
    </mapping>
    <mapping>
      <level value="WARN" />
      <forecolor value="Yellow" />
    </mapping>
    <mapping>
      <level value="ERROR" />
      <forecolor value="Red" />
    </mapping>
    <mapping>
      <level value="DEBUG" />
      <forecolor value="Blue" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <conversionpattern value="%date [%thread] %-5level - %message%newline" />
    </layout>
  </appender>
</log4net>

3、加载log4net的配置的并创建相关实例

这里有两种办法,第一种最简单,这种情况适用于控制台应用程序,简单明了,直接用加载到程序集中:

using log4net;
using log4net.Config;
using System;
using System.IO;
using System.Reflection;

namespace NetCore3Log4Net.Tutorial.ConsoleApp
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            // 加载配置的 configuration
            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

            Console.WriteLine("Hello world!");

            // 打印日志
            log.Info("Hello logging world!");
            log.Error("Error!");
            log.Warn("Warn!");

            Console.ReadLine();
        }
    }
}

第二种办法是通过依赖注入的方式加载log4net,这种方法适合用在MVC网站项目中使用,首先要注册Log4Net服务:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup()

            .ConfigureLogging((hostingContext, builder) =>
            {
                //该方法需要引入Microsoft.Extensions.Logging名称空间
                builder.AddFilter("System", LogLevel.Error); //过滤掉系统默认的一些日志
                builder.AddFilter("Microsoft", LogLevel.Error);//过滤掉系统默认的一些日志

                //添加Log4Net
                var path = Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config");
                //不带参数:表示log4net.config的配置文件就在应用程序根目录下,也可以指定配置文件的路径
                //需要添加nuget包:Microsoft.Extensions.Logging.Log4Net.AspNetCore
                builder.AddLog4Net(path);
            });
        });

其次,要在Startup.cs中注入Log4Net

// 注意在CreateDefaultBuilder中,添加Autofac服务工厂
/// 
/// 自定义容器服务注册
/// 
/// 
public void ConfigureContainer(ContainerBuilder builder)
{
    // 业务逻辑层 所在程序集命名空间
    Assembly service = Assembly.Load("WebAPI.Services");
    // 接口层 所在程序集命名空间
    Assembly repository = Assembly.Load("WebAPI.IService");
    // 自动注入
    builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();

    // 注入Log4Net
    builder.RegisterType().As().SingleInstance();
}
08
7

ABP框架能力清单

0
归档:2022年7月分类:C#和.NET

ABP框架提供了一个稳定的架构用于构建企业级软件解决方案,它遵循了.NET和ASP.NETCore平台之上的最佳实践。它内置了基础架构、生产级别的模块、主题、工具、指南和文档,并尽可能地自动化开发细节和解法我们的重复性工作。

在接下来的几个小节中,我将从架构层面介绍ABP是如何完成所有这些工作。

ABP架构

ABP是一个特殊的架构,换句话说,它是一个有个性化的框架。先解释一下什么是没有个性的框架,什么是有个性的框架。

正如我在搭建架构部分所述,为搭建解决方案的基础设施需要大量决策工作;比如系统架构、开发模型、技术、模式、工具和库。

没有个性的框架,例如ASP.NETCore,这些决定大多由您决定。例如,您可以通过将UI层与数据访问层分离来创建分层解决方案,或者您可以通过直接从UI页面/视图访问数据库来创建单层解决方案。您可以使用任何库,只要它与ASP.NETCore兼容,并且您可以应用任何架构模式。无个性使ASP.NETCore在不同的场景中变得灵活和可用。但是,所有的这些都需要我们自己去做决策。

我并不是说ASP.NETCore完全没有自己的个性想法。假定您正在构建基于HTTP规范的Web应用程序或API。它清楚地定义了应该如何开发UI和API层。它还提供了一些低级的基础设施组件,例如依赖项注入、缓存和日志记录。但是,它并没有说明您的业务代码是应该要如何组建,应该使用哪些架构模式。

换句话说,ABP框架是一个有个性倾向的框架。它相信软件开发方法本质上可以更好,因此可以引导开发人员在解决方案中使用更佳的架构、模式、工具和库。
尽管ABP框架足够灵活,可以使用不同的工具和库来改变您的架构决策,但当您遵循它的实践原则时,您将获得最大的价值。请别担心,因为它为通用架构提供了良好的、行业认可的解决方案。他的架构规则将节省您的时间,提高您的生产力,并使您专注于您的业务代码而不是基础设施问题。

在接下来,我将介绍ABP所支持的四种基本架构。

领域驱动设计

ABP的主要目标是根据整洁代码原则提供一个模型来构建易维护的解决方案。它提供了一个基于DDD模式和实践的分层架构。它提供了一个分层的启动模板、基础架构以及架构应用指南。

由于ABP是一个软件框架,它专注于DDD的技术实现。本书的第3部分,实现领域驱动设计,解释了使用ABP框架构建基于DDD的最佳实践。

模块化

在软件开发中,模块化是一种拆分系统成独立模块的技术。最终目标是降低复杂性,提高可重用性,使不同的团队能够在不相互影响的情况下能并行处理不同的功能集。

ABP构建模块化有两个主要挑战:

第一个挑战是模块隔离。尽管ASP.NETCore有一些特性(例如Razor组件库)来支持模块化。但是,它仍然非常有限,因为它是一个底层通用的框架,并且仅对UI和API部分支持。另一方面,ABP框架提供了一个一致的模型和基础设施来构建完全隔离的、可重用的应用模块及数据库、领域、应用和UI层。

第二个挑战是模块之间如何通信,使之成为一个统一的应用程序。ABP为模块化系统提供常见的模型,例如在模块之间共享数据库,在模块之间通过事件或API进行通信,以及模块安装。

ABP提供了许多可在任何应用程序中使用的预构建模块。包括身份验证模块,它提供用户、角色和权限管理,同时也提供登录和注册页面。他们基本上都是可重用和自定义的。此外,ABP提供了模块启动模板,帮助您构建可重用的应用程序。这方面的一个例子可以在[第15章]使用模块化中详细介绍。

模块化非常适合管理复杂的大型单体系统。但是,ABP也可以帮助您创建微服务解决方案。

微服务

微服务和分布式架构是构建可扩展系统的公认方法。它允许不同的团队开发不同的服务并独立地对服务进行单独部署和扩展。

但是,构建微服务系统在团队开发、部署、微服务间通信、数据一致性、监控等方面存在一些重要挑战。

微服务系统是一种将不同的学科、方法、技术和工具结合在一起来解决独特问题的解决方案。每个微服务系统都有其要求和限制。每个团队都有一定程度的专业知识、知识和技能。

ABP框架从一开始就被设计为与微服务兼容。它在具有事务支持的微服务之间提供了一个用于异步通信的分布式事件总线。它还提供C#客户端代理来轻松调用远程服务的RESTAPI。

所有预构建的ABP应用模块都经过设计,以便您可以将它们转换为微服务。ABP也提供了详细指南来解释如何创建微服务兼容模块。这样,您可以从模块化单体开始,然后将其转换为微服务解决方案。

ABP团队准备了一个使用ABP框架构建的开源微服务参考方案。它演示了如何使用API网关、微服务间通信、分布式事件、分布式缓存、多个数据库提供程序和多个UI应用程序。它还包括在容器上运行解决方案的Kubernetes和Helm配置。详情参阅。

SaaS/多租户

软件即服务(SaaS)是一种广泛使用的架构模式。以下是多租户系统的典型特征:

在租户之间共享硬件和软件资源。每个租户都有用户、角色和权限。在租户之间隔离数据库、缓存和其他资源。可以启用/禁用每个租户的应用功能。可以为每个租户自定义应用配置。

ABP框架涵盖了所有这些要求甚至更多。它可以帮助您优雅地构建多租户系统,而您几乎感受不到多租户的存在。

到目前为止,我已经介绍了四种ABP基本架构模式。此外,ABP还提供了启动模板来轻松创建新的解决方案。

启动模板

使用ASP.NETCore自带的模板创建新解决方案时,只能获得单个项目,没有分层和依赖关系。您通常会花费大量时间来设置解决方案架构,包括安装工具和做配置基本。

ABP框架提供了一个架构完善、分层清晰、预配置和生产就绪的启动解决方案模板。以下截图显示了当您运行ABP框架创建的启动模板时的初始UI:

下面谈谈这个启动模板:解决方案已经做好逻辑分层。一些预构建模块,例如Account和Identity模块。已经实现了基本的登录、注册、用户和角色管理以及其他一些标准功能。预先配置好的单元测试和集成测试项目。一些管理数据库迁移以及使用HTTPAPI实用工具。

ABP的启动模板带有UI框架和数据库提供者的多个选项。你可以从Angular、Blazor或MVC(RazorPages)选择一个作为UI框架,或者使用EntityFrameworkCore或MongoDB作为数据库提供者。

ABP基础设施

ABP基于您已经了熟悉的工具和库。它没有引入新的对象关系映射器(ORM),而是使用EntityFrameworkCore。同样,它使用Serilog、AutoMapper、IdentityServer和Bootstrap,而不是自己创建类似的功能。它提供了一个解决方案集成了这些工具,并实现了常见的业务应用需求。

ABP框架按照约定简化了异常处理、验证、授权、缓存、审计日志和数据库事务管理,并允许您在需要时进行精细控制。

ABP与IdentityServer很好地集成,基于cookie和令牌的身份验证以及单点登录。它还提供了一个详细的、基于权限的授权系统来帮助您控制应用的权限。

同时也提供了后台作业、BLOB存储、文本模板、审计日志和本地化等常见组件。

在UI部分,ABP提供了完整的UI主题系统,帮助您开发无主题的模块化应用,并轻松为应用程序安装主题。它还在UI方面提供了大量功能和帮助程序,以消除重复代码。

社区

当您在公司中搭建解决方案架构时,除了开发人员没有人会去研究它。然而,ABP拥有一个庞大而活跃的社区。他们使用相同的架构和基础设施,应用类似的最佳实践,并以类似的方式开发他们的应用程序。当您遇到基础架构问题或想要获得解决业务问题的想法或建议时,这具有很大的优势。由于ABP开发人员正在应用相同或相似的模式,因此在另一个解决方案中也更容易理解他人的代码。

ABP框架自2016年以来一直存在并不断发展。截至2021年底,它在GitHub上拥有7,000多颗星、220多位贡献者、22,000多个提交、5,700个已关闭问题,以及在NuGet上超过4,000,000次下载,超过110多个专业和次要版本。我的意思是,它是一个成熟的、被接受的、值得信赖的开源项目。

来自ABP核心团队和社区的贡献者,有着不断持续输出的文章,视频教程和ABP社区网站可供大家学习。

28
6

这段时间开始阅读.NET Core内部技术的书籍,发现了很多之前忽视的技术,果然还是得通过阅读,才可以加深对技术的理解。今天了解到了ASP.NET Core应用程序配合web服务器的工作原理。

Web服务器(如IIS)通过一个配置的端口与完全解耦的可执行文件通信,并将传入的请求转发给控制台应用程序。这个控制台应用程序由一个必要的HTTP模块从US进程空间生成,该HTTP模块使IIS能够支持ASP.NETCore。要将ASP.NETCore应用程序托管到其他Web服务器(如Apache或NGINX)上,必须有类似的扩展模块。

这里值得注意的是,图中给出的ASP.NETCore架构与最初的架构(即2003年将ASP.NET1.x与IIS连接起来的架构)有类似之处。当时ASP.NET有自己的工作进程,通过命名管道与IIS通信。后来,ASP.NET工作进程的任务被内置的IIS工作进程(w3wp.exe)接过,从而有了应用程序池的概念。在ASP.NETCore中,两个独立的、无关的、完全解耦的可执行文件进行通信,但是ASP.NET可执行文件并不是一个多租户工作进程,而只是托管一个基本的异步服务器来处理传入请求的应用程序的一个实例。

21
6

装并运行升级助手
在命令提示符下,运行以下命令安装升级助手工具:

dotnet tool install -g --add-source 'https://api.nuget.org/v3/index.json' --ignore-failed-sources upgrade-assistant

现在,你已准备好在解决方案或项目上运行该工具。让我们先分析项目的包依赖项。

导航到包含项目或解决方案的目录,并运行以下命令:

upgrade-assistant analyze

将此页命令上的 更改为解决方案或项目文件的路径和名称。

上一个命令将生成 SARIF 格式的报告,该报告基于 JSON 格式,可使用以下查看器查看:

任何文本编辑器。
VS extension for SARIF Viewer for a richer experience.

分析项目依赖项后,运行以下命令以开始升级项目:

upgrade-assistant upgrade

该工具还支持其他选项。有关完整的工具使用情况信息,请参阅 GitHub 上的 升级助手自述文件。

22
10

[转]开源框架Autofac使用入门

0
归档:2021年10月分类:C#和.NET

一、Autofac是什么

说到Autofac,我们就要首先了解依赖注入(Dependency Injection,简称DI)。DI不是什么技术,而是一种设计模式,是用来降低计算机程序之间的耦合的。在.net平台,有很多依赖注入工具,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,Autofac是一款较为轻量级的、性能优异的、支持xml配置的依赖注入工具。这也是为什么我选择先学习Autofac的原因。

1.1 依赖注入(DI)和控制反转(IOC)

依赖注入(Dependency Injection)DI是一种软件设计模式,用来允许我们开发松耦合代码。DI是一种很好的方式去减少软件模块之间的紧耦合关心。DI帮助更好的去管理软件中的功能更新和复杂度。DI的目的是让代码可维护。依赖注入模式使用构造器对对象初始化并提供需要的依赖给对象,也就意味着允许你从类外部注入一个依赖项。

控制反转(IOC,Inversion Of Contrl)也是一种设计模式,它是对DIP(依赖倒置原则,Dependence Inversion Principle)的一种实现。IOC指的是一种框架或运行时的编程风格,用来控制程序流程。IOC意味着我们可以改变常规的控制方式。它在DIP下得以实现。许多基于.net框架的软件开发都使用IOC。IOC更多的是一个通用术语,不仅仅局限于DI。

1.2 DI和IOC在项目中起到什么作用

假设你的客户端类需要使用一个服务类组件,那么你能做的就是让你的客户知道一类IService接口而不是服务类。这样,你就可以随时改变Service类的实现而不会中断已经部署的代码。

二、Autofac如何使用

首先你必须获取AutoFac,这里你可以通过各种方式加载它,我这里还是通过VS中的NuGet来加载AutoFac,不论是哪种方式,最终的目的就是将 Autofac.dll,Autofac.Configuration.dll 这两个程序集引用到你的项目中。这样在你的项目中,如果想使用AutoFac,只需添加其命名空间引用即可~ 这里我用的是2.6版本的(PS:Autofac.Configuration.dll V4.1 已经没有ConfigurationSettingsReader 用法稍有改变,还没去研究)

2.1 Demo分析

代码Demo,这里在控制台应用程序中使用,首先创建一个类

    /// <summary>
    /// 定义一个Animal接口
    /// </summary>
    public interface IAnimal
    {
        void DogCall();
        void CatCall();
    }

然后,写一个类继承此接口

public class Call: IAnimal
    {
        public void CatCall()
        {
            Console.WriteLine("喵喵喵");
        }

        public void DogCall()
        {
            Console.WriteLine("汪汪汪");
        }
    }

接着,用Autofac

    static void Main(string[] args)
        {
        var builder = new ContainerBuilder();//创建一个IOC容器
        builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
        //Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
        using (var container = builder.Build())
        {
          //当注册的类型在相应得到的容器中可以Resolve你的Call类中所有实例。
          var call = container.Resolve<IAnimal>();
          call.DogCall();
          call.CatCall();
        }

        Console.ReadLine();

      }

使用Autofac的步骤:第一步,定义一个Container容器。第二步,创建builder,并在builder中注册类型。第三步,实例化容器。第四步,在需要使用接口的地方,通过container来解析得到一个借口的实例。

2.2 更多注册容器的方法

我们想将该类型选择通过文件配置进行读取。Autofac自带了一个Autofac.Configuration.dll 非常方便地对类型进行配置,避免了程序的重新编译。修改App.config:在根节点下加上(PS:configSections在程序配置文件中只能放在最前,不然会报配置文件未能初始化错误)

<configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <!--IOC为控制台项目名称-->
  <autofac defaultAssembly="IOC">
    <components>
      <component type="IOC.Call, IOC" service="IOC.IAnimal" />
    </components>
  </autofac>

然后将RegisterType注册方法替换为通过配置文件的方式注册

builder.RegisterType<Call>().As<IAnimal>();//通过AS可以让Call类中通过构造函数依赖注入类型相应的接口。
            builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

其中还有很多注册的方式:Lambda注册、程序集批量注册、Module注册。

17
8

开发过程中,我们有时候需要获取用户的客户端机器的ip地址,在遥远的拨号上网年代,我们只需要通过很简单的Remote_Addr就能获得客户端的真是ip地址,可是随着代理服务器的普及,客户端的ip地址往往不那么容易拿到。

一、Remote_Addr

这个值表示发出请求的远程主机的IP地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

二、x_forwarded_for

简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP。

设置格式:X-Forwarded-For: 127.0.0.1, 192.168.1.1, 202.19.89.64

这个设置表示请求由127.0.0.1发出,经过三层代理,第一层是192.168.1.1,第二层是202.19.89.64,而本次请求的来源IP 1.1.1.1是第三层代理。

三、X-Real-IP

当有多个代理时候,可以在第一个反向代理上配置“proxy_set_header X-Real-IP $remote_addr” 获取真实客户端IP;

四、案例分析

file

(一)、第一种情况

Nginx Proxy
202.19.89.64 nginx.conf
location /test {
    proxy_pass http://192.168.108.1;
}
192.168.108.1 nginx.conf
location /test {
    proxy_pass http://192.168.108.2;
}
Nginx Proxy就是简单的把请求往后转发。
Nginx Backend
192.168.108.108 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr || $http_x_forwarded_for";
}

Nginx Backend输出客户端IP($remote_addr)和X-Forwarded-For请求头($http_x_forwarded_for),当访问服务时输出结果:192.168.108.108 ||

1.$remote_addr代表客户端IP,当前配置的输出结果为最后一个代理服务器的IP,并不是真实客户端IP;

2.在没有特殊配置情况下,X-Forwarded-For请求头不会自动添加到请求头中,即Nginx Backend的$http_x_forwarded_for输出为空。

(二)、第二种情况

通过添加X-Real-IP和X-Forwarded-For捕获客户端真实IP。

Nginx Proxy
202.19.89.64 nginx.conf
location /test {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.108.1;
}
192.168.108.1 nginx.conf
location /test {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.108.2;
}
Nginx Backend
192.168.108.108 nginx.conf
location /test {
    default_type text/html;
    charset gbk;
    echo "$remote_addr ||$http_x_real_ip  ||$http_x_forwarded_for";
}

当访问服务时,输出结果为:192.168.108.108 || 202.19.89.64 || 192.168.108.1, 192.168.108.2

1、在离用户最近的反向代理NginxProxy 1,通过“roxy_set_header X-Real-IP remote_addr把真实客户端IP写入到请求头X-Real-IP,在NginxBackend输出http_x_real_ip获取到了真实客户端IP;而Nginx Backend的remote_addr输出为最后一个反向代理的IP。

2、“proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for”的是把请求头中的X-Forwarded-For与remote_addr用逗号合起来,如果请求头中没有X-Forwarded-For则proxy_add_x_forwarded_for为remote_addr。

3、X-Forwarded-For代表了客户端IP,反向代理如Nginx通过proxy_add_x_forwarded_for添加此项,X-Forwarded-For的格式为 X-Forwarded-For real client ip, proxy ip 1, proxy ip N,每经过一个反向代理就在请求头X-Forwarded-For后追加反向代理IP。

4、到此我们可以使用请求头X-Real-IP和X-Forwarded-For来获取客户端IP及客户端到服务端经过的反向代理IP了。这种方式还是很麻烦,$remote_addr并不是真实客户端IP。

五、总结

X-Forwarded-For一般是每一个非透明代理转发请求时会将上游服务器的IP地址追加到X-Forwarded-For的后面,使用英文逗号分割;

X-Real-IP一般是最后一级代理将上游IP地址添加到该头中;

X-Forwarded-For是多个IP地址,而X-Real-IP是一个。

05
8

从WebForm到MVC,一直到Blazor

0
归档:2021年8月分类:C#和.NET

打算下一个项目用Blazor,学习了一个下午,这是一个很不错的全栈UI框架,基于WebAssembly技术,可以让开发人员直接用C#完成js的工作。

学习过程中,我脑子里闪现了自己经历的那个ASP.NET的WebForm时代,那时候我们用UserControl的ascx文件布局网页。查了下,果然是一脉相承。
https://docs.microsoft.com/en-us/dotnet/architecture/blazor-for-web-forms-developers/architecture-comparison

我把消息发群里,大家开始回忆曾经用过的方法,包括ViewState,GridView,IsPostBack,masterpage,repeater,这些技术确实都是一代人的回忆。

不过认真回想,微软的WwebFrom的理念是超前的, 只不过碍于当时的技术发展, 只能做成那样,后来的UI框架其实都给予它的思想。

“技术会落后,思想传承”,微软的技术从WebForm到MVC,一直到一直到Blazor,使用的WebUI的组件技术一直都没有改变,果然是汇集世界一流软件工程师的公司。

18
6

微软具有里程碑意义的Visual Studio 2022 Preview 1已经正式发布,虽然没有增加新功能,但是这个IDE重点支持64位。与此同时,微软也发布了.NET 6 Preview 5。

https://devblogs.microsoft.com/visualstudio/visual-studio-2022-preview-1-now-available/

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-5/

https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-5/

微软在曾经在4月份在官方的博客文章种宣布了VS2022将会第一次支持64位,不再局限于4GB的内存限制,通过Windows上的64位的Visual Studio,你可以打开,编辑、运行和调试非常复杂的解决方案。

微软通过一个Gif视频展示64位的优势,最新版本的Visual Studio 2022可以轻松打开包含约1600个项目和大约300000个文件的解决方案。

微软在6月17日的文章 Visual Studio 2022 Preview 1 now available!,关键目标是测试和调整新 64 位平台的可扩展性!这是一个巨大的变化,影响到IDE的每一个部分。微软呼吁早期采用者开发者帮助开展这项工作,称"我们需要您的反馈"。VS 2019 功能不包括在预览 1:

Web实时预览
仪器分析仪
Azure 云服务项目支持
T-SQL 调试器
Web负载测试和测试控制器/测试代理
Azure数据湖
Coded界面测试
DotFuscator
内置 IDE 集成
智能提示的代码查找并替换

64 位版本Visual Studio 2022 Preview 1 三个版本的早期版本(社区、专业版和企业版) ,现在已经可以下载了:https://visualstudio.microsoft.com/zh-hans/vs/preview/vs2022/

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。