gpt4 book ai didi

c# - 由 MS Excel 和 COM 托管的 C#2 中的委托(delegate)中的异常行为

转载 作者:行者123 更新时间:2023-11-30 18:11:05 25 4
gpt4 key购买 nike

大家早上好

这里有点语言理论问题......我在网上找到了一些引用资料,表明 C# 中的异常处理和委托(delegate)在某些情况下有一些不同的行为,但我找不到关于这个问题的任何具体文档。

我们最近遇到了一些大问题,在 Microsoft Excel 插件的委托(delegate)内部出现异常,导致 MSVC 运行时发生硬崩溃。移除委托(delegate)解决了这个问题,但我现在很想知道血淋淋的细节。

作为核心代码的简洁示例:

Delegate del; // initialized elsewhere
try
{
del.DynamicInvoke();
}
catch(Exception e)
{
/* Parsing of exception to generate user-friendly message here */
}

上述构造允许集中形式的错误处理,并且从纯代码的角度来看是干净简洁的。每个公开公开的函数都被声明为委托(delegate)并通过上述片段执行。

在一个简单的控制台应用程序中,从委托(delegate)中抛出异常或只是一个普通的意外错误(例如,“意外地”在空指针上调用 ToString())会按预期工作,并且会按需要处理错误。

在 MS Excel 中投入使用,你会遇到严重的崩溃。单步执行代码将显示错误发生的位置,但没有堆栈展开似乎发生在一切都变成毁灭性的大火球之前。

我的假设是,托管 .NET 运行时(以及我们的代码)的 COM 正在做一些与正常 .NET 代码执行不同的事情。这会终止端点,而 Excel 并不知道这一点,而 Excel 又会尝试通过 COM 访问端点,结果却发现它不知何故消失了,而 Excel 则报错了。

这只发生在 Excel+COM+delegates 的组合中,但老实说我不知道​​哪个对这种行为更有影响......有什么想法吗?

最佳答案

我认为您可能会在这里发现,您没有释放在抛出异常时隐式创建的 MS Excel COM 对象。根据我的经验,MS Office 应用程序对其未发布的资源非常敏感(尽管我的大部分经验是使用 Outlook)。

如果可能的话,我倾向于不尝试以这种方式处理基于 COM 的异常。如果您想要集中记录日志,请改为查看 Application.ThreadException(对于 WinForms 应用程序)和 AppDomain.CurrentDomain.UnhandledException。

在您的函数内部,您可能希望在方法的 finally {} block 中调用 Marshal.ReleaseComObject(),以确保在抛出异常时 Excel 不会被清除。

关于c# - 由 MS Excel 和 COM 托管的 C#2 中的委托(delegate)中的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com