前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET Core应用基本编程模式[4]:基于承载环境的编程

ASP.NET Core应用基本编程模式[4]:基于承载环境的编程

作者头像
蒋金楠
发布于 2020-11-24 07:08:22
发布于 2020-11-24 07:08:22
78200
代码可运行
举报
文章被收录于专栏:大内老A大内老A
运行总次数:0
代码可运行

基于IHostBuilder/IHost的承载系统通过IHostEnvironment接口表示承载环境,我们利用它不仅可以得到当前部署环境的名称,还可以获知当前应用的名称和存放内容文件的根目录路径。对于一个Web应用来说,我们需要更多的承载环境信息,额外的信息定义在IWebHostEnvironment接口中。[本文节选自《ASP.NET Core 3框架揭秘》第11章, 更多关于ASP.NET Core的文章请点这里]

目录 一、IWebHostEnvironment 二、通过配置定制承载环境 三、针对环境的编程 注册服务 注册中间件 配置

一、IWebHostEnvironment

如下面的代码片段所示,派生于IHostEnvironment接口的IWebHostEnvironment接口定义了两个属性:WebRootPath和WebRootFileProvider。WebRootPath属性表示用于存放Web资源文件根目录的路径,WebRootFileProvider属性则返回该路径对应的IFileProvider对象。如果我们希望外部可以采用HTTP请求的方式直接访问某个静态文件(如JavaScript、CSS和图片文件等),只需要将它存放于WebRootPath属性表示的目录之下即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IWebHostEnvironment : IHostEnvironment
{
    string     WebRootPath { get; set; }
    IFileProvider WebRootFileProvider { get; set; }
}

下面简单介绍与承载环境相关的6个属性(包含定义在IHostEnvironment接口中的4个属性)是如何设置的。IHostEnvironment 接口的ApplicationName代表当前应用的名称,它的默认值取决于注册的IStartup服务。IStartup服务旨在完成中间件的注册,不论是调用IWebHostBuilder接口的Configure方法,还是调用它的UseStartup/UseStartup<TStartup>方法,最终都是为了注册IStartup服务,所以这两个方法是不能被重复调用的。如果多次调用这两个方法,最后一次调用针对IStartup的服务注册会覆盖前面的注册。

如果IStartup服务是通过调用IWebHostBuilder接口的Configure方法注册的,那么应用的名称由调用该方法提供的Action<IApplicationBuilder>对象来决定。具体来说,每个委托对象都会绑定到一个方法上,而方法是定义在某个类型中的,该类型所在程序集的名称会默认作为应用的名称。如果通过调用IWebHostBuilder接口的UseStartup/UseStartup<TStartup>方法来注册IStartup服务,那么注册的Startup类型所在的程序集名称就是应用名称。在默认情况下,针对应用名称的设置体现在如下所示的代码片段中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder, Action<IApplicationBuilder> configure)
{
    var applicationName = configure.GetMethodInfo().DeclaringType .GetTypeInfo().Assembly.GetName().Name;
    ...
}

public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder,  Type startupType)
{
    var applicationName = startupType.GetTypeInfo().Assembly.GetName().Name;
    ...
}

EnvironmentName表示当前应用所处部署环境的名称,其中开发(Development)、预发(Staging)和产品(Production)是3种典型的部署环境。根据不同的目的可以将同一个应用部署到不同的环境中,在不同环境中部署的应用往往具有不同的设置。在默认情况下,环境的名称为Production。

当我们编译发布一个ASP.NET Core项目时,项目的源代码文件会被编译成二进制并打包到相应的程序集中,而另外一些文件(如JavaScript、CSS和表示View的.cshtml文件等)会复制到目标目录中,我们将这些文件称为内容文件(Content File)。ASP.NET Core应用会将所有的内容文件存储在同一个目录下,这个目录的绝对路径通过IWebHostEnvironment接口的ContentRootPath属性来表示,而ContentRootFileProvider属性则返回针对这个目录的PhysicalFileProvider对象。部分内容文件可以直接作为Web资源(如JavaScript、CSS和图片等)供客户端以HTTP请求的方式获取,存放此种类型内容文件的绝对目录通过IWebHostEnvironment接口的WebRootPath属性来表示,而针对该目录的PhysicalFileProvider自然可以通过对应的WebRootFileProvider属性来获取。

在默认情况下,由ContentRootPath属性表示的内容文件的根目录就是当前应用程序域的基础目录,也就是表示当前应用程序域的AppDomain对象的BaseDirectory属性返回的目录,静态类AppContext的BaseDirectory属性返回的也是这个目录。对于一个通过Visual Studio创建的 .NET Core项目来说,该目录就是编译后保存生成的程序集的目录(如“\bin\Debug\netcoreapp3.0”或者“\bin\Release\netcoreapp3.0”)。如果该目录下存在一个名为“wwwroot”的子目录,那么它将用来存放Web资源,WebRootPath属性将返回这个目录;如果这样的子目录不存在,那么WebRootPath属性会返回Null。针对这两个目录的默认设置体现在如下所示的代码片段中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    static void Main()
    {       
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builderUseStartup<Startup>())
        .Build()
        .Run();
    }
}
public class Startup
{
    public Startup(IWebHostEnvironment environment)
    {
        Debug.Assert(environment.ContentRootPath == AppDomain.CurrentDomain.BaseDirectory);
        Debug.Assert(environment.ContentRootPath == AppContext.BaseDirectory);

        var wwwRoot = Path.Combine(AppContext.BaseDirectory, "wwwroot");
        if (Directory.Exists(wwwRoot))
        {
            Debug.Assert(environment.WebRootPath == wwwRoot);
        }
        else
        {
            Debug.Assert(environment.WebRootPath == null);
        }
    }
    public void Configure(IApplicationBuilder app) {}
}

二、通过配置定制承载环境

IWebHostEnvironment对象承载的4个与承载环境相关的属性(ApplicationName、EnvironmentName、ContentRootPath和WebRootPath)可以通过配置的方式进行定制,对应配置项的名称分别为applicationName、environment、contentRoot和webroot。如果记不住这些配置项的名称也没有关系,因为我们可以利用定义在静态类WebHostDefaults中如下所示的4个只读属性来得到它们的值。通过第11章的介绍可知,前三个配置项的名称同样以静态只读字段的形式定义在HostDefaults类型中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class WebHostDefaults
{
    public static readonly string EnvironmentKey = "environment";
    public static readonly string ContentRootKey = "contentRoot";
    public static readonly string ApplicationKey = "applicationName";
    public static readonly string WebRootKey  = "webroot";;
}

public static class HostDefaults
{
    public static readonly string EnvironmentKey = "environment";
    public static readonly string ContentRootKey = "contentRoot";
    public static readonly string ApplicationKey = "applicationName";
}

下面演示如何通过配置的方式来设置当前的承载环境。在如下这段实例程序中,我们调用IWebHostBuilder接口的UseSetting方法针对上述4个配置项做了相应的设置。由于针对UseStartup<TStartup>方法的调用会设置应用的名称,所以通过调用UseSetting方法针对应用名称的设置需要放在后面才有意义。相对于当前目录(项目根目录)的两个子目录“contents”和“contents/web”是我们为ContentRootPath属性与WebRootPath属性设置的,由于系统会验证设置的目录是否存在,所以必须预先创建这两个目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .ConfigureLogging(options => options.ClearProviders())
            .UseStartup<Startup>()
            .UseSetting("environment", "Staging")
            .UseSetting("contentRoot", Path.Combine(Directory.GetCurrentDirectory(), "contents"))
            .UseSetting("webroot", Path.Combine(Directory.GetCurrentDirectory(), "contents/web"))
            .UseSetting("ApplicationName", "MyApp"))
        .Build()
        .Run();
    }

    public class Startup
    {
        public Startup(IWebHostEnvironment environment)
        {
            Console.WriteLine($"ApplicationName: {environment.ApplicationName}");
            Console.WriteLine($"EnvironmentName: {environment.EnvironmentName}");
            Console.WriteLine($"ContentRootPath: {environment.ContentRootPath}"); 
            Console.WriteLine($"WebRootPath: {environment.WebRootPath}");
        }
        public void Configure(IApplicationBuilder app) { }
    }
}

我们在注册的Startup类型的构造函数中注入了IWebHostEnvironment服务,并直接将这4个属性输出到控制台上。我们在目录“C:\App”下运行这个程序后,设置的4个与承载相关的属性会以下图所示的形式呈现在控制台上。

由于IWebHostEnvironment服务提供的应用名称会被视为一个程序集名称,针对它的设置会影响类型的加载,所以我们基本上不会设置应用的名称。至于其他3个属性,除了采用最原始的方式设置相应的配置项,我们还可以直接调用IWebHostBuilder接口中如下3个对应的扩展方法来设置。通过本系列之前文章介绍可知,IHostBuilder接口也有类似的扩展方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class HostingAbstractionsWebHostBuilderExtensions
{
    public static IWebHostBuilder UseEnvironment(this IWebHostBuilder hostBuilder, string environment);
    public static IWebHostBuilder UseContentRoot(this IWebHostBuilder hostBuilder, string contentRoot);
    public static IWebHostBuilder UseWebRoot(this IWebHostBuilder hostBuilder, string webRoot);
}

public static class HostingHostBuilderExtensions
{
    public static IHostBuilder UseContentRoot(this IHostBuilder hostBuilder, string contentRoot);
    public static IHostBuilder UseEnvironment(this IHostBuilder hostBuilder,  string environment);
}

三、针对环境的编程

对于同一个ASP.NET Core应用来说,我们添加的服务注册、提供的配置和注册的中间件可能会因部署环境的不同而有所差异。有了这个可以随意注入的IWebHostEnvironment服务,我们可以很方便地知道当前的部署环境并进行有针对性的差异化编程。

IHostEnvironment接口提供了如下这个名为IsEnvironment的扩展方法,用于确定当前是否为指定的部署环境。除此之外,IHostEnvironment接口还提供额外3个扩展方法来进行针对3种典型部署环境(开发、预发和产品)的判断,这3种环境采用的名称分别为Development、Staging和Production,对应静态类型EnvironmentName的3个只读字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class HostEnvironmentEnvExtensions
{
    public static bool IsDevelopment(this IHostEnvironment hostEnvironment);
    public static bool IsProduction(this IHostEnvironment hostEnvironment);
    public static bool IsStaging(this IHostEnvironment hostEnvironment); 
    public static bool IsEnvironment(this IHostEnvironment hostEnvironment, string environmentName);
}

public static class EnvironmentName
{
    public static readonly string Development = "Development";
    public static readonly string Staging     = "Staging";
    public static readonly string Production = "Production";
}

注册服务

下面先介绍针对环境的服务注册。ASP.NET Core应用提供了两种服务注册方式:第一种是调用IWebHostBuilder接口的ConfigureServices方法;第二种是调用UseStartup方法或者UseStartup<TStartup>方法注册一个Startup类型,并在其ConfigureServices方法中完成服务注册。对于第一种服务注册方式,用于注册服务的ConfigureServices方法具有一个参数类型为Action<WebHostBuilderContext, IServiceCollection>的重载,所以我们可以利用提供的WebHost

BuilderContext对象以如下所示的方式针对具体的环境注册相应的服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    public static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .ConfigureServices((context,svcs)=> {
                if (context.HostingEnvironment.IsDevelopment())
                {
                    svcs.AddSingleton<IFoobar, Foo>();
                }
                else
                {
                    svcs.AddSingleton<IFoobar, Bar>();
                }
            }))
            .Build()
            .Run();
    } 
}

如果利用Startup类型来添加服务注册,我们就可以按照如下所示的方式通过构造函数注入的方式得到所需的IWebHostEnvironment服务,并在ConfigureServices方法中根据它提供的环境信息来注册对应的服务。另外,Startup类型的ConfigureServices方法要么是无参的,要么具有一个类型为IServiceCollection的参数,所以我们无法直接在这个方法中注入IWebHost

Environment服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    private readonly IWebHostEnvironment _environment;
    public Startup(IWebHostEnvironment environment) => _environment = environment;
    public void ConfigureServices(IServiceCollection svcs)
    {
        if (_environment.IsDevelopment())
        {
            svcs.AddSingleton<IFoobar, Foo>();
        }
        else
        {
            svcs.AddSingleton<IFoobar, Bar>();
        }
    }
    public void Configure(IApplicationBuilder app) { }
}

除了在注册Startup类型中的ConfigureServices方法完成针对承载环境的服务注册,我们还可以将针对某种环境的服务注册实现在对应的Configure{EnvironmentName}Services方法中。上面定义的Startup类型完全可以改写成如下形式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    public void ConfigureDevelopmentServices(IServiceCollection svcs)=> svcs.AddSingleton<IFoobar, Foo>();
    public void ConfigureServices(IServiceCollection svcs)=> svcs.AddSingleton<IFoobar, Bar>()
    public void Configure(IApplicationBuilder app) {}
}

注册中间件

与服务注册类似,中间件的注册同样具有两种方式:一种是直接调用IWebHostBuilder接口的Configure方法;另一种则是调用注册的Startup类型的同名方法。不管采用何种方式,中间件都是借助IApplicationBuilder对象来注册的。由于针对应用程序的IServiceProvider对象可以通过其ApplicationServices属性获得,所以我们可以利用它提供承载环境信息的IWebHostEnvironment服务,进而按照如下所示的方式实现针对环境的中间件注册。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    public static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .Configure(app=> {
                var environment = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                if (environment.IsDevelopment())
                {
                    app.UseMiddleware<FooMiddleware>();
                }
                app
                    .UseMiddleware<BarMiddleware>()
                    .UseMiddleware<BazMiddleware>();
            }))                       
            .Build()
            .Run();
    }
}

其实,用于注册中间件的IApplicationBuilder接口还有UseWhen的扩展方法。顾名思义,这个方法可以帮助我们根据指定的条件来注册对应的中间件。注册中间件的前提条件可以通过一个Func<HttpContext, bool>对象来表示,对于某个具体的请求来说,只有对应的HttpContext对象满足该对象设置的断言,指定的中间件注册操作才会生效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class UseWhenExtensions
{
    public static IApplicationBuilder UseWhen(this IApplicationBuilder app,  Func<HttpContext, bool> predicate, Action<IApplicationBuilder> configuration);
}

如果调用UseWhen方法来实现针对具体环境注册对应的中间件,我们就可以按照如下所示的方式利用HttpContext来提供针对当前请求的IServiceProvider对象,进而得到承载环境信息的IWebHostEnvironment服务,最终根据提供的环境信息进行有针对性的中间件注册。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
{
    public static void Main()
    {
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .Configure(app=> app
                .UseWhen(context=>context.RequestServices.GetRequiredService<IWebHostEnvironment>().IsDevelopment(),
                    builder => builder.UseMiddleware<FooMiddleware>())
                .UseMiddleware<BarMiddleware>()
                .UseMiddleware<BazMiddleware>()))
            .Build()
            .Run();
    }
}

如果应用注册了Startup类型,那么针对环境的中间件注册就更加简单,因为用来注册中间件的Configure方法自身是可以注入任意依赖服务的,所以我们可以在该方法中按照如下所示的方式直接注入IWebHostEnvironment服务来提供环境信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    public void Configure(IApplicationBuilder app, IWebHostEnvironment environment)
    {
        if (environment.IsDevelopment())
        {
            app.UseMiddleware<FooMiddleware>();
        }
        app
            .UseMiddleware<BarMiddleware>()
            .UseMiddleware<BazMiddleware>();
    }
}

与服务注册类似,针对环境的中间件注册同样可以定义在对应的Configure{EnvironmentName}方法中,上面这个Startp类型完全可以改写成如下形式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Startup
{
    public void ConfigureDevelopment (IApplicationBuilder app)
    {
        app.UseMiddleware<FooMiddleware>();
    }

    public void Configure(IApplicationBuilder app)
    {
        app
            .UseMiddleware<BarMiddleware>()
            .UseMiddleware<BazMiddleware>();
    }
}

配置

上面介绍了针对环境的服务和中间件注册,下面介绍如何根据当前的环境来提供有针对性的配置。通过前面的介绍可知,IWebHostBuilder接口提供了一个名为Configure

AppConfiguration的方法,我们可以调用这个方法来注册相应的IConfigureSource对象。这个方法具有一个类型为Action<WebHostBuilderContext, IConfigurationBuilder>的参数,所以可以通过提供的这个WebHostBuilderContext上下文得到提供环境信息的IWebHostEnvironment对象。

如果采用配置文件,我们可以将配置内容分配到多个文件中。例如,我们可以将与环境无关的配置定义在Appsettings.json文件中,然后针对具体环境提供对应的配置文件Appsettings.

{EnvironmentName}.json(如Appsettings.Development.json、Appsettings.Staging.json和Appsettings.

Production.json)。最终我们可以按照如下所示的方式将针对这两类配置文件的IConfigureSource注册到提供的IConfigurationBuilder对象上。

ASP.NET Core编程模式[1]:管道式的请求处理

ASP.NET Core编程模式[2]:依赖注入的运用

ASP.NET Core编程模式[3]:配置多种使用形式

ASP.NET Core编程模式[4]:基于承载环境的编程

ASP.NET Core编程模式[5]:如何放置你的初始化代码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
应用程序无法正常启动0xc000005?Win10报错0xc0000005详解与解决方案
当我们在电脑上运行某个程序时,如果弹出了0xc0000005的错误提示,那么说明应用程序正在尝试访问不允许访问的内存位置。导致这种报错的原因有很多,包括但不限于软件内部问题、系统文件损坏、驱动程序问题、内存问题或系统兼容性问题所引起的。下面将提供一系列可能的解决方案来帮助您解决这个问题。
八碗米饭
2025/02/14
8460
应用程序无法正常启动0xc000005?Win10报错0xc0000005详解与解决方案
裸金属发货失败,不一定是没货,可能是镜像有问题,比如镜像里包含了不兼容的显卡驱动或者没包含网卡驱动
裸金属发货失败,不一定是没货,可能是镜像有问题,比如用于购买BMG机型的镜像里包含了不兼容的显卡驱动(没有显卡驱动没事,有但是不兼容则会有问题)
Windows技术交流
2023/10/09
3240
视频剪辑软件Adobe Premiere 2023详细下载安装教程
Premiere Pro 2023 v23.1.0.63是一款由Adobe公司最新推出的视频编辑软件,该软件不仅仅是可以帮助用户提升自己的创作能力以及创作自由度,甚至还具有易学、高效以及精确的优点,这都可以为用户们提供采集、剪辑、调色、美化音频、字幕添加、语音识别、输出以及DVD刻录一整套的操作流程。
知识兔下载
2023/04/21
2.4K0
如何下载适合本机的NVIDIA显卡驱动
显卡驱动的更新周期不确定,单独使用第三方驱动更新工具可能无法及时看到新显卡驱动的更新趋势。不过我们可以在显卡官网选择NVIDIA显卡驱动方便下载。如何下载N卡驱动?请看下文。
小狐狸说事
2022/11/17
10.2K0
如何下载适合本机的NVIDIA显卡驱动
Windows10 配置 Nvidia 驱动与 Cuda 环境搭建
Windows 配置GPU加速编程环境可能问题比Linux多一些,本文记录配置过程。 环境需求 当前配置 操作系统:Windows 10 显卡型号:Nvidia GeForce GTX 960M 当前驱动:391.25 目标 升级显卡驱动 安装适用的Cuda 安装配套的Cudnn 测试安装结果 升级显卡驱动 查看当前驱动信息 打开Nvidia控制面板 可以看到自己的显卡和驱动 查看并下载自己可用的驱动版本 登录官网:https://www.nvidia.cn/geforce/drivers/
为为为什么
2022/08/05
2.2K0
Windows10 配置 Nvidia 驱动与 Cuda 环境搭建
pr2022系统不满足安装要求-pr软件下载-2022新版下载
1.首先彻底清除PR软件残留文件,清除工具需要上网下载。2.重新启动电脑后,再次运行PR安装程序。3.不要修改PR软件的安装目录,使用默认路径安装软件。4.根据以上步骤即可正常安装PR软件。
木子学Lee
2023/02/17
1.3K0
pr2022系统不满足安装要求-pr软件下载-2022新版下载
MAC怎么下载安装ps、au、dw和pr这些设计软件啊?
经常有人问PS安装教程、AI设计软件怎么安装,所以今天我们先来以MAC系统为例,教大家怎么安装Premiere Pro,在Mac系统上安装Adobe全家桶系列设计软件方法都可以参考此教程。
office小助手
2022/05/14
2.4K0
MAC怎么下载安装ps、au、dw和pr这些设计软件啊?
Premiere Pro 2023下载安装pr2023v23.0版激活-pr2023全新版本来了
pr2023中文版全称adobe premiere pro 2023,是知识兔由adobe公司打造的一款主流视频编辑软件,提供视频编辑、知识兔视频调色、音频编辑、字幕添加等一整套工作流程,再加上尖端的色彩修正知识兔、强大的新音频控制和多个嵌套的时间轴等功能,知识兔能够给用户带来一个自由渲染的编辑体验。软件操作非常简单,用户只需导入镜头视频文件,知识兔通过修剪工具在时间线上进行编辑,知识兔等达到你想要的效果后,再通过动态效果控制或关键帧,知识兔创建来制作转场和标题的动画或动态特效,最后知识兔调整音频水平并导出视频即可。所有操作都可在该平台内完成,内置的功能可完美知识兔的解决用户编辑、制作、知识兔工作流上所遇到的任何问题,能够满足用户创建出高质量作品的要求。此外,知识兔pr2023中文版的兼容性非常强大,能用与ps、ae 和au无缝协作,知识兔用户可以通过其数千项创意资源和数百项第三方扩展,知识兔快速开始高质量的创作流程。
用户10122115
2022/10/28
1.6K0
【CUDA】cuda安装 (windows版)[通俗易懂]
本次安装参考了网上许多教程,结合自己的需求与理解,写下此篇博客,仅做本人总结使用。。
全栈程序员站长
2022/09/06
11.2K0
【CUDA】cuda安装 (windows版)[通俗易懂]
系统更新后驱动程序丢失,如何恢复?
是山河呀
2025/03/23
3200
Adobe Premiere Pro 2023 正式版下载一键安装教程-pr2023激活版
Adobe Premiere Pro 2023(Pr2023)是领先的电影、电视和网络视频编辑软件。知识兔premiere Pro 23.0 版专为帮助编辑人员制作创意内容而设计,提供了出色的字幕工具组合。知识兔借助改进功能(如批量编辑时间轴中的标题剪辑、灵活的对齐控件等)简化您的标题和图形工作流程。知识兔此版本包含稳定性和性能方面的基础改进,包括更快的动态图形模板和 GPU 加速的 Lumetri 范围。知识兔凭借对全新 ARRI Alexa 35 和 Apple Silicon 设备上的 AAF 文件的支持,知识兔互操作性和格式支持得到了扩展。
用户10122115
2022/10/27
1.9K0
新手入门 | 搭建 AI 模型开发环境
NVIDIA 显卡有多个系列,常用的有 Tensor 和 GeForce RTX 系列,两类显卡的驱动安装方式不一样,下面的章节会单独介绍如何安装驱动。
痴者工良
2025/03/26
2370
新手入门 | 搭建 AI 模型开发环境
解决The NVIDIA driver on your system is too old (found version 9010). Please updat
最近,当我尝试在我的电脑上运行一个需要GPU支持的应用程序时,我遇到了一个错误信息:"The NVIDIA driver on your system is too old (found version 9010). Please update your GPU driver"。这意味着我的电脑上安装的NVIDIA驱动程序版本太旧,无法满足应用程序的要求。这篇博客将介绍如何解决这个问题,并升级GPU驱动程序。
大盘鸡拌面
2023/10/25
2.3K0
Adobe Premiere Pro 2022最新版PR中文版下载-Pr2023官方下载
Adobe Premiere Pro 2022是一款由Adobe公司推出的常用视频知识兔编辑软件,它可以提升您的创作能力和知识兔创作自由度,它是易学、高效、精确的视频剪辑软件。知识兔新版本功能更强大,让你的视频编辑工作更顺心!
用户10122115
2022/11/01
1.4K0
Adobe创新大会|Project Aero发布封闭内测版,Premiere Pro 13.0正式支持VR180格式
美国时间10月15日,Adobe MAX 2018全球创新大会(以下统称为“Adobe创新大会”)已在洛杉矶拉开帷幕。
VRPinea
2018/10/19
9500
Adobe创新大会|Project Aero发布封闭内测版,Premiere Pro 13.0正式支持VR180格式
Win10下配置WSL2使用CUDA搭建深度学习环境
操作系统:Windows 10 专业版 22H2(保系统版本高于windows10 21H2或Windows11)
御坂妹
2024/11/04
2K0
Pico Neo 3教程☀️ 五、开发者工具:实时预览工具(Preview Tool)
在开发应用的过程中,实时预览工具(Preview Tool)允许开发者使用 Unity Editor 对应用进行实时预览。
星河造梦坊官方
2024/08/15
2850
Pico Neo 3教程☀️ 五、开发者工具:实时预览工具(Preview Tool)
英特尔平台安装黑苹果
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u011054333/article/details/87864983
乐百川
2019/07/02
1.7K0
英特尔平台安装黑苹果
Clover 引导器.配置助手[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127932.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
1.4K0
从CentOS官网下载系统镜像详细教程[通俗易懂]
CentOS(Community Enterprise Operating System,社区企业操作系统)是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本,以高效、稳定著称。它使用与Red Hat相同的源代码编译而成,而且是开源免费的,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用,是很多中小服务器站点的首选。CentOS拥有Red Hat的所有功能,它们的不同之处在于CentOS并不包含封闭源代码软件,即Red Hat提供的额外的商业服务。
全栈程序员站长
2022/08/18
10.8K0
从CentOS官网下载系统镜像详细教程[通俗易懂]
推荐阅读
相关推荐
应用程序无法正常启动0xc000005?Win10报错0xc0000005详解与解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验