2012-03-16 74 views
1

在我的WPF应用程序中,第一次用户打开菜单时,由于Accessibility.dll的延迟加载导致暂停。缓慢的Accessibility.dll延迟加载?

正如你可以想象这是非常烦人的,所以我想在启动时强制加载这个程序集。我已经尝试了几种不用运气的方法。例如使用Assembly.Load()或AppDomain.Load()。这些调用都没有导致程序集加载(即我没有得到AssemblyLoaded事件,我试图直接引用assmebly来获得正确的AssemblyName来调用这些方法,但仍然没有运气。 ?实现这一目标

非常感谢 丹

编辑:呼吁的组件负载堆栈(点击菜单后)

mscorlib.dll中System.AppDomain.OnAssemblyLoadEvent(System.Reflection.RuntimeAssemblyLoadedAssemly [!原产于 !管理过渡]
[托管到本机过渡]
PresentationFramework.dll System.Windows.Controls.Primitives.Popup.CreateWindow(布尔asyncCall)

从弹出的调用是:

_secHelper.ForceMsaaToUiaBridge( _popupRoot.Value);

回答

2

是的,您可以使用反射(RuntimeHelpers.PrepareMethod)强制JIT编译器在后台线程中编译所需的方法。这是一个描述那个的CodeProject article

RuntimeHelpers.PrepareMethod是线程安全的,所以在这种情况下使用是安全的。

这是代码,稍加修改,以排除通用和P /调用的函数:

Thread jitter = new Thread(() => 
{ 
    var flags = BindingFlags.DeclaredOnly | BindingFlags.NonPublic | 
       BindingFlags.Public | BindingFlags.Instance | 
       BindingFlags.Static; 

    foreach (var assembly in AssembliesToPreload) 
     foreach (var type in a.GetTypes()) 
      foreach (var method in type.GetMethods(flags)) 
      { 
       if (method.ContainsGenericParameters || 
        method.IsGenericMethod || 
        method.IsGenericMethodDefinition) 
        continue; 

       if ((method.Attributes & MethodAttributes.PinvokeImpl) > 0) 
        continue; 

       RuntimeHelpers.PrepareMethod(method.MethodHandle); 
      } 
    } 
}); 

jitter.Priority = ThreadPriority.Lowest; 
jitter.Start(); 
+0

框架程序集是由ngen.exe预先拼写的 – 2012-03-16 12:19:59

+0

似乎Accessibility.dll只包含一些接口,所以不知道我是否可以应用这种技术。在打开菜单时首次加载程序集时,我添加了上面的调用堆栈。 – 2012-03-16 13:19:38

+0

@HansPassant:你是对的,我没有意识到它是一个框架组件。虽然到目前为止我还没有使用它,但是如果我把它弄对了,它是一个COM包装器,所以瓶颈可能是COM对象的实例化?如果它应该在STA模型中使用,OP仍然必须在GUI线程中实例化它,所以后台init不会有帮助。 – Groo 2012-03-16 13:22:17

0

我认为有一个在您Accessibility.dll要实例或使用类型。

我认为这里需要花时间的是JIT,所以强制JIT运行只是创建/使用对象的一个​​实例。当我处于类似的情况时,我倾向于添加像Accessibility.RunJIT()这样的方法。我所做的只是创建一个类的实例。

你也可以看看NGen。 http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx

+0

对不起,我不清楚我的问题,我是指框架组件Accessibility.dll。 – 2012-03-16 13:17:08