2023年11月29日发(作者:)
【转】CLR20R3程序终⽌的⼏种解决⽅案
这是因为.NET Framework 1.0 和 1.1 这两个版本对许多未处理异常(例如,线程池线程中的未处理异常)提供⽀撑,⽽ Framework 2.0 版
中,公共语⾔运⾏库允许线程中的多数未处理异常⾃然继续。在多数情况下,这意味着未处理异常会导致应⽤程序终⽌。
⼀、C/S 解决⽅案(以下任何⼀种⽅法)
1. 在应⽤程序配置⽂件中,添加如下内容:
2. 在应⽤程序配置⽂件中,添加如下内容:
private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = ;
EventLog myLog = new EventLog();
= "ThreadException";
ntry(errorMsg + e + "/n/nStack Trace:/n" + race);
}
catch (Exception exc)
{
try
{
("Fatal Non-UI Error",
"Fatal Non-UI Error. Could not write the error to the event log. Reason: "
+ e, , );
}
finally
{
();
}
}
3. 这个⽐较繁琐,分为三步:
⑴. 将下⾯的代码保存成⽂件,⽂件名为,路径是C:/Program Files/Microsoft Visual Studio 8/VC/
using System;
using stics;
using ization;
using ;
using pServices;
string appId = (string) a(".appId");
if (appId != null) {
(appId);
}
Exception currentException = null;
for (currentException = (Exception)ionObject; currentException != null; currentException = xception)
{
Format("/r/n/r/ntype={0}/r/n/r/nmessage={1}/r/n/r/nstack=/r/n{2}/r/n/r/n",
e().FullName,
e,
race);
}
EventLog Log = new EventLog();
= _sourceName;
ntry(ng(), );
}
}
}
⑵. 打开Visual Studio 2005的命令提⽰⾏窗⼝
输⼊Type -k 后回车
输⼊Type csc /t:library /r:, /keyfile: 后回车
输⼊ /if 后回车
输⼊ngen install 后回车
输⼊gacutil /l UnhandledExceptionModule后回车并将显⽰的”强名称”信息复制下来
⑶. 打开应⽤程序的⽂件,将下⾯的XML加到⾥⾯。注意:不包括”[]”,①可能是添加到
间。
三、微软并不建议的解决⽅案
打开位于 %WINDIR%//Framework/v2.0.50727 ⽬录下的 ⽂件,将属性 legacyUnhandledExceptionPolicy 的
enabled 设置为 true
四、跳出三界外——ActiveX
ActiveX 的特点决定了不可能去更改每个客户端的设置,采⽤ B/S 解决⽅案⾥的第 3 种⽅法也不⾏,⾄于⾏不通的原因,我想可能是因为
ActiveX 的⼦控件产⽣的异常直接
被 CLR 截获了,并没有传到最外层的 ActiveX 控件,这只是个⼈猜测,如果有清楚的朋友,还望指正。
最终,我也没找到在 ActiveX 情况的解决⽅法,但这却是我最需要的,⽆奈之下,重新检查代码,发现了其中的问题:在⼦线程中创建了
控件,⼜将它添加到了主线程的 UI 上。
以前遇到这种情况,系统就会报错了,这次居然可以蒙混过关,最搞不懂的是在 framework 2.0 的 C/S 结构下也没有报错,偏偏在
IE(ActiveX) ⾥挂了。唉,都是宿主惹的祸。
原⽂:


发布评论