J'essaye d'écrire un système de plugin qui peut charger des plugins gérés. L'hôte devrait pouvoir décharger les plugins s'il y a des exceptions. pour mon poc J'ai une bibliothèque de code exemple en C# qui jette une exception comme ça ...clr d'hébergement et attraper des exceptions de threading
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;
}
alors j'ai console app native win32 comme ça ..
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;
}
problème est que si J'utilise le code ci-dessus, l'hôte terminerait l'exécution du code managé (la ligne "ceci ne devrait jamais s'imprimer" finirait par imprimer) Si je supprime le clrPolicyManager-> SetUnhandledExceptionPolicy (eHostDeterminedPolicy), le processus hôte se bloquerait.
peut-il être fait quelque chose dans l'hôte non géré qu'il pourrait gracieusement supprimer l'application errant de l'exécution et continuer à travailler?
Votre code a activé la règle de gestion des exceptions .NET 1.x. Qui vient de terminer le fil. Pas ce que vous voulez, vous devrez également appeler ICLRPolicyManager :: SetDefaultAction() pour lui dire de décharger le domaine de l'application sur un abandon de thread. Vous avez toujours un thread mort quelque part, utilisez __try/__ catch pour attraper l'exception. –
J'ai ajouté la ligne suivante clrPolicyManager-> SetDefaultAction (OPR_ThreadAbort, eUnloadAppDomain); pour le code, j'ai mis à jour le code, mais l'effet est le même, le processus hôte se bloque toujours –
Vous avez peut-être manqué la partie "thread mort" du commentaire. Vous devez attraper l'exception SEH. Le code d'exception est 0xe0434f4d. http://msdn.microsoft.com/en-us/library/s58ftw19%28v=VS.100%29.aspx –