Windows 10,在.Net 4.0及更高版本中过度使用comctl32.dll

问题描述 投票:1回答:1

由于文件时间到winxs dll的版本5.82和6.10的comctl32.dll,我遇到缓慢的应用程序(.Net WinForm应用程序)

重复运行应用程序加载comctl32.dll,我尝试添加一个清单,使用vom的commom控件,即comctl32.dll v 6.无效。还试过pinvoke DLL试图强制使用。也无济于事。应用程序包含多个项目或模块。我做了一个简单的测试应用程序,动态地将500个textBox控件添加到flowlauoutpanel。它让我在comctl32.dll上进行Windows 10,6000+操作。在Windows 7上它的2个操作。如果我为.Net 3.5及更低版本构建,它在Windows 10上也只有2个操作。我可以强制应用程序加载comctl32.dll一次,甚至只加载几次而不是几千次? PS。我试过64位和32位。 filetime是200+的因素

代码(只是最小的winforms项目)

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
        InitializeComponent(); 
        AddTextBoxes(500); 
    }
    private void AddTextBoxes(int number) 
    { 
         for (int i = 0; i < number; i++) 
         { 
             TextBox newBox = new TextBox(); 
             newBox.Width = 30; 
             flowLayoutPanel1.Controls.Add(newBox); 
         }
    } 
} 

Build for:net 2.0这是processmonitor中的结果:

  • 共8个事件,文件时间:0.0002639 sek,

Build for .Net 4.0这是processmonitor的结果:

  • 总共6054个事件,文件时间:0.0931603 sek

.Net 3.5不是问题的一部分。只有.Net 4及以上。

在Win10上运行.Net 4.0时,我该怎么做才能减少这些文件事件?

c# .net dll
1个回答
1
投票

问题似乎是Windows 10下本机函数GetModuleHandle的不同行为。此函数在.NET 4中的System.Windows.Forms.Control.CreateParams中调用,但在.NET 2中调用。 每次在Windows 10下调用GetModuleHandle(“comctl32.dll”)结果:

CreateFile C:\Windows\WinSxS\...\comctl32.dll
QueryBasicInformationFile C:\Windows\WinSxS\...\comctl32.dll
CloseFile C:\Windows\WinSxS\...\comctl32.dll

通过调用GetModuleHandle,Windows 7下没有文件操作。

© www.soinside.com 2019 - 2024. All rights reserved.