管理プラグインをロードできるプラグインシステムを作成しようとしています。例外がある場合、ホストはプラグインをアンロードできなければなりません。 私のPOCの私はこのような例外をスローC#でのサンプルコードライブラリを持っている...clrのホスティングとスレッド例外のキャッチ
public static int StartUp(string arguments)
{
Console.WriteLine("Started exception thrower with args {0}", arguments);
Thread workerThread = new Thread(() =>
{
Console.WriteLine("Starting a thread, doing some important work");
Thread.Sleep(1000);
throw new ApplicationException();
}
);
workerThread.Start();
workerThread.Join();
Console.WriteLine("this should never print");
return 11;
}
その後、私はこのようなネイティブのWin32コンソールアプリケーションを持っている...
int _tmain(int argc, _TCHAR* argv[])
{
ICLRMetaHost *pMetaHost = NULL;
HRESULT hr;
ICLRRuntimeInfo *runtimeInfo = NULL;
__try
{
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
hr = pMetaHost->GetRuntime(L"v4.0.30319",IID_ICLRRuntimeInfo,(LPVOID*)&runtimeInfo);
ICLRRuntimeHost *runtimeHost = NULL;
hr = runtimeInfo->GetInterface(CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);
ICLRControl* clrControl = NULL;
hr = runtimeHost->GetCLRControl(&clrControl);
ICLRPolicyManager *clrPolicyManager = NULL;
clrControl->GetCLRManager(IID_ICLRPolicyManager, (LPVOID*)&clrPolicyManager);
clrPolicyManager->SetDefaultAction(OPR_ThreadAbort,eUnloadAppDomain);
hr = runtimeHost->Start();
DWORD returnVal = NULL;
hr = runtimeHost->ExecuteInDefaultAppDomain(L"ExceptionThrower.dll",L"ExceptionThrower.MainExceptionThrower",L"StartUp",L"test",&returnVal);
runtimeHost->Release();
}
__except(1)
{
wprintf(L"\n Error thrown %d",e);
}
return 0;
}
問題があればということです上記のコードを使用すると、ホストはマネージコードの実行を完了します( "これは決して印刷しないでください"という行が印刷されます) clrPolicyManager-> SetUnhandledExceptionPolicy(eHostDeterminedPolicy)を削除すると、ホストプロセスがクラッシュします。
管理対象外のホストでは、実行時に間違ったアプリを正常に削除して作業を続けることができますか?
コードで.NET 1.xの例外処理ポリシーが有効になっています。これは単にスレッドを終了させます。あなたが望むものではなく、ICLRPolicyManager :: SetDefaultAction()を呼び出して、スレッドがアボートしたときにアプリドメインをアンロードするように指示する必要があります。あなたはまだどこかにデッドスレッドがありますが、例外をキャッチするには__try/__ catchを使用します。 –
次の行を追加しました。clrPolicyManager-> SetDefaultAction(OPR_ThreadAbort、eUnloadAppDomain);コードに私はコードを更新しましたが、効果は同じですが、ホストプロセスはまだクラッシュします –
あなたはコメントの「デッドスレッド」の部分を見逃しているかもしれません。 SEH例外を捕捉する必要があります。例外コードは0xe0434f4dです。 http://msdn.microsoft.com/en-us/library/s58ftw19%28v=VS.100%29.aspx –