.Net-関数で参照されている場合、ロードに15秒かかる相互運用アセンブリ
-
07-07-2019 - |
質問
これはC#コンソールアプリケーションです。このようなことをする関数があります:
static void foo()
{
Application powerpointApp;
Presentation presentation = null;
powerpointApp = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
}
これですべてです。呼び出されると、関数がヒットするまでに15秒の遅延があります。このようなものを追加しました:
static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args)
{
Console.WriteLine(DateTime.Now.ToString() + " ASSEMBLY LOADED: " + args.LoadedAssembly.FullName);
Console.WriteLine();
}
これは、foo関数がヒットする約10ミリ秒前に相互運用機能アセンブリがロードされたことを通知して起動されます。これについて何ができますか?プログラムはこの関数を1回呼び出して(最終的には別のことを行う)、終了する必要があるので、これらのアセンブリをキャッシュするか何かにする必要があります。アイデア?
解決
証明書失効リストの可能性があります-これのタイムアウトは15秒です。 イベントログに何かありますか?タイムアウト中にネットワーク接続が発生しているかどうかを確認できますか?
私は少し前に証明書失効遅延に関する詳細をブログに書きました。リンクをたどります。ここではカットアンドペーストしません。
他のヒント
15秒はタイムアウトのように思えます。アセンブリに署名していますか?フレームワークがロード時に証明書失効リストを確認したいが、15秒後に失敗するという問題がありました。
HTH
ティム
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
詳細はこちらをご覧ください
http://msdn.microsoft.com/en-us/library /bb629393.aspx
&quot;サービスで要素を使用して、起動パフォーマンスを改善することをお勧めします。この要素を使用すると、タイムアウトやサービスの起動のキャンセルを引き起こす可能性のある遅延を回避するのにも役立ちます。&quot;
推測しますが、おそらく相互運用機能アセンブリが読み込まれた後にPowerPointが起動するときです。
アプリケーションの起動時にメソッドfoo()が呼び出されず、呼び出される前に他のタスクを実行する必要がある場合、最初に別のスレッドを開始してアセンブリをロードできます。