Tôi đang cố gắng viết một hệ thống plugin có thể tải các plugin được quản lý. Máy chủ lưu trữ sẽ có thể gỡ bỏ các plugin nếu có bất kỳ ngoại lệ nào. cho poc của tôi, tôi có một thư viện mẫu mã trong C# mà ném một ngoại lệ như thế này ...lưu trữ clr và bắt buộc luồng ngoại lệ
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;
}
sau đó tôi có nguồn gốc ứng dụng win32 console như thế này ..
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;
}
Issue là nếu tôi sử dụng mã trên, máy chủ sẽ hoàn thành chạy mã được quản lý (dòng "này không bao giờ in" sẽ kết thúc in) Nếu tôi xóa clrPolicyManager-> SetUnhandledExceptionPolicy (eHostDeterminedPolicy), thì quá trình lưu trữ sẽ bị lỗi.
mọi thứ có thể được thực hiện trong máy chủ không được quản lý để có thể xóa ứng dụng không đúng cách khỏi thời gian chạy và tiếp tục làm việc?
Mã của bạn đã bật chính sách xử lý ngoại lệ .NET 1.x. Mà chỉ chấm dứt sợi. Không phải những gì bạn muốn, bạn cũng cần phải gọi ICLRPolicyManager :: SetDefaultAction() để yêu cầu nó dỡ bỏ miền ứng dụng trên một chuỗi bị hủy bỏ. Bạn vẫn còn một thread chết ở đâu đó, sử dụng __try/__ catch để bắt ngoại lệ. –
Tôi đã thêm dòng sau clrPolicyManager-> SetDefaultAction (OPR_ThreadAbort, eUnloadAppDomain); để mã, tôi đã cập nhật mã, nhưng hiệu quả là như nhau, quá trình lưu trữ vẫn treo –
Bạn có thể đã bỏ lỡ phần "chuỗi chết" của nhận xét. Bạn phải bắt ngoại lệ SEH. Mã ngoại lệ là 0xe0434f4d. http://msdn.microsoft.com/en-us/library/s58ftw19%28v=VS.100%29.aspx –