1

興味深い問題に遭遇しました。いくつかのアセンブリで構成されたアプリケーションがあります。アプリケーションをインストールしましたが、必須ではない小さなアセンブリを1つ忘れました。そのアセンブリの使用を必要とするメソッドに到達するまで、アプリケーションは起動して正常に動作しているように見えました。ご想像のとおり、"Could not load file or assembly 'Blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Blah' or one of its dependencies. The system cannot find the file specified."例外が表示されます。

そこに驚きはありませんよね?はい、インストーラーは修正でき、私の問題は解決しましたが、プログラムでそれを行う方法があるかどうかを確認したかったのです。そこで、必須ではないアセンブリを使用するコードをtryブロックでラップし、finallyブロックで高価なリソースを次のように解放してみました。

public void MethodA()
{
    try
    {
        // Do stuff with non essential assembly
    }
    finally
    {
        // Release expensive resource here
    }
}

JITコンパイラがtryブロック内からスローして、最終的に制御をfinallyブロックに戻し、リソースが解放されると考えています。JITコンパイラは、メソッドが呼び出された時点でスローします。

コールチェーンの最後のブロックを上に移動することを考えましたが、このメソッドは何百もの場所から呼び出されています。必須ではないアセンブリにAssembly.Loadを使用することを考えましたが、反射を使用する必要があるという考えは、私を汚く感じさせます。

この場合、再構築しすぎたり、シャワーを浴びたりせずに、finallyブロックを実行する方法はありますか?つまり、リフレクションを使用しますか?

4

2 に答える 2

1

不要なアセンブリを使用して作業を行う別のメソッドを定義します。

方法Aから呼び出します。

それで:

public void MethodA()
{
    try
    {
        MethodAImpl();
    }
    finally
    {
    }
}
于 2010-02-25T02:25:49.967 に答える
1

アセンブリが必須ではない場合は、アセンブリロードの使用に問題はありません。なぜ汚いと思うのかわかりません。リフレクションは.NETのもう1つの側面です

于 2010-02-25T02:26:12.220 に答える