图 2 通过 CCW 进行的 .NET 调用
为了解该方案对于晚绑定客户端失败的原因,我将演练从晚绑定 COM 客户端进行的托管方法调用。.NET 方法调用是通过由 asp.dll 承载的脚本引擎(VBScript 或 JScript_)中的晚绑定启动的。这会导致在 CCW 上调用 IDispatch::Invoke(传递一个 EXCEPINFO 结构)。接下来,CCW 调用托管对象上的实际托管方法。在我们的方案中,该方法会引发异常。CCW 捕捉该异常并调用 SetErrorInfo 来存储该异常的信息。IDispatch::Invoke 的实现看到发生了异常,并且调用 GetErrorInfo 以检索它填充 EXCEPINFO 结构所需要的信息。由于 GetErrorInfo 清除了错误信息,因此当 IDispatch::Invoke 返回时,.NET 异常会丢失。该过程在图 2 中进行了概述。
返回页首
解决办法
使异常得以发布的一种解决办法是修改托管代码组件中的所有属性/方法,以捕捉所有类型的异常,并且在重新引发之前发布它们:
public void DoSomethingUseful()
{
try
{
... // Do some useful work
}
catch(Exception exception)
{
文章来源于领测软件测试网 https://www.ltesting.net/