2012-03-16 25 views
1

私のWPFアプリケーションでは、初めてユーザーがメニューを開くときに、Accessibility.dllの遅延読み込みによって一時停止が発生します。Accessibility.dllの遅い遅延ロード?

これは非常に迷惑なので、起動時にこのアセンブリを強制的にロードしたいと思います。私は運がないとこれを行ういくつかの方法を試してみました。たとえば、Assembly.Load()またはAppDomain.Load()を使用します。これらの呼び出しのいずれもアセンブリの読み込みになりません(つまり、AssemblyLoadedイベントは発生しません。これらのメソッドを呼び出すために正しいAssemblyNameを取得するためにassmeblyを直接参照しようとしましたが、まだ運がありません)。

正しい方法?これを実現する

多くのおかげ ダン

編集:(メニューをクリックした後)組立負荷のスタックを呼び出し

が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によって事前にjittingされています –

+0

Accessibility.dllにはいくつかのインタフェースが含まれているため、この手法を適用できるかどうかはわかりません。アセンブリを最初に読み込んでメニューを開くときに上記の呼び出しスタックを追加しました。 –

+0

@HansPassant:そうです、私はそれがフレームワークアセンブリであることを認識しませんでした。私はこれまでこれを使用していませんでしたが、それが正しいとすればCOMラッパーなので、COMオブジェクトのインスタンス化がボトルネックになる可能性があります。 STAモデルで使用されるはずだが、OPはGUIスレッドでインスタンス化する必要があるため、バックグラウンドのinitは役に立ちません。 – Groo

0

私はあなたがインスタンスまたは使用したいあなたAccessibility.dllでタイプがあることを前提としています。

私はここで時間を取るのはJITだと思うので、JITを強制的に実行してオブジェクトのインスタンスを作成/使用するようにしてください。 Accessibility.RunJIT()のようなメソッドを追加する傾向があります。次に、クラスのインスタンスを作成するだけです。

NGenを見ることもできます。 http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx

+0

申し訳ありませんが私の質問では不明だった、私はフレームワークのアセンブリAccessibility.dllを参照していた。 –