【问题标题】:How to load all DLLs used by NetCore at program startup如何在程序启动时加载 NetCore 使用的所有 DLL
【发布时间】:2021-05-26 03:10:15
【问题描述】:

我正在 dotnet5 开发 wpf。

已添加 DevExpress 组件用于开发。

在开发过程中, 当您调用包含 DevExpress 控件的子窗口时 加载所需的 DLL 大约需要 2 秒。

加载完成后,如果再次关闭窗口再次调用,会立即调用。

这被认为是加载与 DevExpress 控件相关的 DLL 所需的时间。

我通过 Nuget 安装了 DevExpress 相关的包。 有没有办法在程序运行时预加载所有必需的包相关 DLL?

【问题讨论】:

    标签: c# wpf dll .net-5


    【解决方案1】:

    您可以开始为特定程序集中的类型运行静态初始化程序。虽然您可能想在后台线程中启动它。

    foreach (var a in
        AppDomain.CurrentDomain.GetAssemblies()
            .Where(a => a.GetCustomAttribute<AssemblyCompanyAttribute>()?.Company == /* todo */ )
        )
    {
        foreach (var t in a.GetTypes())
            RuntimeHelpers.RunClassConstructor(t.TypeHandle);
    }
    

    但可能会有进一步的延迟初始化来加速这些 DevExpress 控件。

    【讨论】:

    • 感谢 cmets。很抱歉没有理解你的想法。你能要求更具体的解释吗?
    • 运行类构造函数会强制运行所有static 变量和构造函数,这不会造成伤害。您需要使用某种分析工具来测量时间的真正去向,并猜测在不创建 gui 控件的情况下如何使初始化运行。
    【解决方案2】:

    有点。首先请注意,程序集加载和 JIT 是在第一次调用时发生的,因此加载程序集只是工作的一部分。

    您可以构建单个文件应用程序 https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file 并可选择使用提前编译 https://docs.microsoft.com/en-us/dotnet/core/deploying/ready-to-run

    【讨论】:

    • 感谢 cmets。我尝试基于此编译和运行,但我仍然遇到同样的性能问题。 T_T 在MainWindows中创建一个SubWindows对象,目的是消除第一次调用时出现的性能问题。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2012-05-23
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多