np-*_*ard 13 c# clr clr-hosting
我正在尝试编写一个可以加载托管插件的插件系统.如果有任何异常,主机应该能够卸载插件.对于我的poc,我在C#中有一个示例代码库,它会抛出这样的异常......
 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),那么主机进程将崩溃.
可以在非托管主机中完成任何事情,它可以优雅地从运行时删除错误的应用程序并继续工作?
您可以专门为每个给定的插件启动一个新的 AppDomain 并在其中启动它。请参阅http://msdn.microsoft.com/en-us/library/ms164323.aspx
每个 AppDomain 都是一个可以执行代码的隔离环境。一个AppDomain中发生的异常可以与其他应用程序域隔离。请参阅:http ://msdn.microsoft.com/en-us/library/system.appdomain(v=VS.100).aspx
| 归档时间: | 
 | 
| 查看次数: | 2860 次 | 
| 最近记录: |