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) ⾥挂了。唉,都是宿主惹的祸。

原⽂: