私が知っている簡単な答えはありません。
あなたは堅牢なDLLを作成したい場合、あなたはいくつかのシナリオのために準備する必要があります
- あなたのコードは、デフォルトのAppDomainに、.NETアプリケーションでホストされています。 (簡単なシナリオ)
- コードは、.NETアプリケーション、ホストコードで作成されたAppDomainでホストされます。
- あなたのコードは、アンマネージドアプリケーション(CLRをホストする)でホストされています。
第3のシナリオは、ホストでCLRを無効にすることができ、管理されたコードはもう実行されないため、最も扱いにくいシナリオです。
System.Windows.Forms.Application.ApplicationExit
は、WinFormアプリケーションにのみ適用されるため、悪いことです。
System.AppDomain.DomainUnload
それ自体は、デフォルトのAppDomainのために生成されることはないので、それ自体では問題ありません。
AppDomain.ProcessExit
単独でコードが別のAppDomainでホストされている場合、ホストはそのAppDomainをアンロードして、イベントが発生しないようにします。
私は、ほとんどのケースをカバーしようとしているようなもの使用して起動したい
:
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
AppDomain.CurrentDomain.ProcessExit += MyTerminationHandler;
else
AppDomain.CurrentDomain.DomainUnload += MyTerminationHandler;
をしかし、次の発言(from MSDN)に気づくの操作を行います。すべてのProcessExitイベントの総実行時間
をプロセスのシャットダウン時にすべてのファイナライザの合計実行時間が制限されているのと同じように、ハンドラは制限されています。デフォルトは2秒です。アンマネージホストは、OPL_ProcessExit列挙値を指定してICLRPolicyManager :: SetTimeoutメソッドを呼び出すことによって、この実行時間を変更できます。
上記のコードでは、3番目のシナリオは無人です。 (最初の2と一緒に)そのシナリオに対処するための私の知っている二つの方法
まず次のように、あなたは、System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
メソッドを使用することができますがあります。
{
// this goes at your code's entry point
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(MyExecutionCode, MyCleanupCode, null);
}
static void MyExecutionCode(object data) { /* your execution code here */}
static void MyCleanupCode(object data, bool exceptionThrown) { /* your cleanup code here */ }
第二に、あなたはSystem.Runtime.ConstrainedExecution.CriticalFinalizerObject
を利用することができますクラス(see MSDN here)を継承し、クリーンアップコードをファイナライザに入れます。これには、クリーンアップコードがConstrained Execution Regionガイドラインに準拠する必要があります。
SetConsoleCtrlHandlerのCTRL_CLOSE_EVENTイベントを試すことができます。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016%28v=vs.85%29.aspx –