大家早,
这里有点语言理论问题......我在网上找到了一些参考资料,表明 C# 中的异常处理和委托在某些情况下有一些不同的行为,但我找不到任何关于此事的具体文档。
我们最近在 Microsoft Excel 插件的委托中遇到了一些大问题,导致 MSVC 运行时发生硬崩溃。删除代表解决了这个问题,但我现在很想知道血腥的细节。
作为核心代码的一个简洁示例:
Delegate del; // initialized elsewhere
try
{
del.DynamicInvoke();
}
catch(Exception e)
{
/* Parsing of exception to generate user-friendly message here */
}
上述结构允许集中形式的错误处理,并且从纯代码的角度来看是简洁明了的。每个公开公开的函数都被声明为委托并通过上述片段执行。
在一个简单的控制台应用程序中,从委托中抛出异常或只是一个普通的意外错误(例如“意外地”在空指针上调用 ToString())按预期工作,并按需要处理错误。
扔进 MS Excel,你会遇到严重的崩溃。单步执行代码将显示错误发生的位置,但在一切都陷入巨大的破坏火球之前,似乎没有发生堆栈展开。
我的假设是,托管 .NET 运行时(以及我们的代码)的 COM 正在做一些不同于正常 .NET 代码执行的事情。这会杀死端点,而 Excel 不知道这一点,而 Excel 又试图通过 COM 访问端点,却发现它不知何故消失了,而 Excel 作为回报也报废了。
这只发生在 Excel+COM+delegates 的组合中,但老实说,我不知道哪个对这种行为影响更大……有什么想法吗?