Estoy tratando de escribir un sistema de complemento que pueda cargar complementos administrados. El host debería poder descargar los complementos si hay alguna excepción. para mi poc Tengo una biblioteca de código de ejemplo en C# que se produce una excepción como esta ...hosting clr y catching threading exceptions
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;
}
entonces he aplicación de consola Win32 nativa como esto ..
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;
}
tema es que si utilizo el código anterior, el host completaría la ejecución del código administrado (la línea "esto nunca debería imprimir" terminaría imprimiendo) Si elimino clrPolicyManager-> SetUnhandledExceptionPolicy (eHostDeterminedPolicy), el proceso de host se bloqueará.
¿Se puede hacer algo en el host no administrado que podría eliminar con gracia la aplicación errante del tiempo de ejecución y continuar funcionando?
Su código habilitó la política de manejo de excepciones de .NET 1.x. Lo cual solo termina el hilo. No es lo que quiere, también necesitará llamar a ICLRPolicyManager :: SetDefaultAction() para indicarle que descargue el dominio de la aplicación en un aborto de subprocesos. Todavía tiene un hilo muerto en alguna parte, use __try/__ catch para capturar la excepción. –
Agregué la siguiente línea clrPolicyManager-> SetDefaultAction (OPR_ThreadAbort, eUnloadAppDomain); para el código, he actualizado el código, pero el efecto es el mismo, el proceso del host todavía se cuelga. –
Es posible que haya perdido la parte del comentario "dead thread". Debes atrapar la excepción SEH. El código de excepción es 0xe0434f4d. http://msdn.microsoft.com/en-us/library/s58ftw19%28v=VS.100%29.aspx –