0

コンパイルされた JIT であることを確認したい関数があります (つまり、呼び出される直前)。これを保証する属性またはアセンブリ設定はありますか? そうでない場合、関数がコンパイルされた JIT であることをどのように保証できますか?

ありがとう!

編集:

参照されているアセンブリが見つからないためにアプリケーションがクラッシュするのを防ぐために、これを行いたいと考えています。関数が JIT でコンパイルされている場合、不足しているアセンブリを参照する関数呼び出しを try...catch ブロックでラップし、状況を適切に処理できます。

クラス全体 (またはアプリケーション全体) が Jitted になる可能性があることを理解しています。これにより、おそらくキャッチできなかったエラーが発生します。

4

3 に答える 3

2

これを正しく読めば、クラス/メソッドを最初にコンパイルするときにエラーが発生するのではないかと心配しています。これには、境界の認識が必要です。追加のレイヤーで取得できます。

'SuspectTypeに問題がある場合(つまり、必要なアセンブリがロードされていない場合)、Scenario1()自体のJittingが失敗するため、以下のtry/catchは役に立ちません。

void Scenario1()
{
   try
   {
     var x = new SuspectType();
     ...
   }
   catch (..) { ... }    
}

次のように書き直すことができます

void Scenario1a()
{
   try
   {
      Scenario1b();
   }
   catch (..) { ... }    

}

void Scenario1b()
{
     var x = new SuspectType();
     ...
}

しかし、Jon Skeetのコメントによると、これがCFxに当てはまるかどうかはわかりません。

于 2009-06-01T16:21:30.023 に答える
0

私は間違った質問に答えているかもしれませんが、主にアセンブリロードの失敗をインターセプトできるようにしたいようです(JITされているクラス全体が呼び出しの周りのtry / catchガードを打ち負かしますが、それはメソッド呼び出しの周りに明示的なガードを使用することの副作用です) 。

アセンブリ解決の問題をキャッチしたい場合は、考えられるすべての呼び出しの周りにtry / catchを指定する代わりに、グローバルAssemblyResolveイベントをリッスンして、アセンブリの読み込みの失敗に応答することができます(ここでは、ネイティブdllの.Netアセンブリについて説明しています。ロード障害は、別のメカニズムで追跡する必要があります)。

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure;
    //...
}

static Assembly OnResolveFailure(object sender, ResolveEventArgs args)
{
    //Do something here...
}

これの欠点は、別の場所でアセンブリを探す(またはエラーをログに記録する)以外は、多くのことを実行できないことです。解決が失敗した場合の特定の適切なロジックは、ロードの失敗をキャッチするこの方法では提供されません。

于 2009-06-01T16:16:53.237 に答える
0

これは、アプリが独自に解決できるようにする必要があるものですか、それとも、現在何らかのアセンブリ ロードの問題をデバッグしていますか?

後者の場合は、融合ログを見てください。これは、実行時にアセンブリをプローブして読み込むサブシステムによって生成されるログです。

ここに記事があります: http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx

于 2009-06-01T18:47:13.473 に答える