मैं एक प्लगइन सिस्टम लिखने की कोशिश कर रहा हूं जो प्रबंधित प्लगइन लोड कर सकता है। यदि कोई अपवाद हैं तो मेजबान प्लगइन को अनलोड करने में सक्षम होना चाहिए। मेरी POC के लिए मैं सी # है कि इस तरह एक अपवाद फेंकता में एक नमूना कोड पुस्तकालय है ...होस्टिंग क्लियर और थ्रेडिंग अपवाद
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 अपवाद हैंडलिंग नीति सक्षम करता है। जो सिर्फ धागे को समाप्त करता है। आप जो चाहते हैं उसे नहीं, आपको आईसीएलआर पॉलिसी मैनेजर :: SetDefaultAction() को थ्रेड एबॉर्ट पर ऐप डोमेन को अनलोड करने के लिए कहने के लिए भी कॉल करना होगा। आपके पास अभी भी एक मृत धागा है, अपवाद को पकड़ने के लिए __try/__ पकड़ का उपयोग करें। –
मैंने निम्नलिखित पंक्ति clrPolicyManager-> SetDefaultAction (OPR_ThreadAbort, eUnloadAppDomain) जोड़ा; कोड में, मैंने कोड अपडेट किया है, लेकिन प्रभाव समान है, मेजबान प्रक्रिया अभी भी –
क्रैश हो गई है, आपने टिप्पणी के "मृत धागे" भाग को याद किया होगा। आपको एसईएच अपवाद पकड़ना होगा। अपवाद कोड 0xe0434f4d है। http://msdn.microsoft.com/en-us/library/s58ftw19%28v=VS.100%29.aspx –