【问题标题】:Life cycle of .NET automation server called from Excel over COM通过 COM 从 Excel 调用的 .NET 自动化服务器的生命周期
【发布时间】:2011-03-14 13:21:29
【问题描述】:

正如主题所说,我编写了一个 C# 类,例如 Test,然后将其编译为 DLL,并将其作为 COM 自动化服务器公开给 Excel。现在,您可以直接或通过 VBA 函数在 Excel 公式中调用该类的方法,该函数本身在后台调用它们。在第二种情况下发生的事情是相对透明的(您编写了代码!),而在第一种情况下,我假设一个 Test 实例被透明地实例化然后使用(它必须因为暴露的方法不是并且 - 从我读过的-- 不能是静态的),但确切的时间和方式尚不清楚。因此,我的问题是:在此设置中调用的自动化服务器的确切生命周期是什么?记录在哪里?

一个附属问题是,是否有办法让公式中的直接调用和通过 VBA 的调用都使用单个单例的 Test 实例?我想我已经知道如何让所有 VBA 过程使用单个 Test 实例,但即便如此,只要在公式中直接调用 Test 方法,就会创建第二个。

最后,如果 Test 类拥有类级别的资源(即静态资源),您应该何时以及如何处置它们?同样,这引出了一个问题,即 .Net/COM Interop 何时创建和销毁测试类。

精度:服务是一个 DLL,而不是应用程序,并且 Excel 应该是唯一使用它的东西,尽管可能打开了多个电子表格副本。这是 Excel 2007。

【问题讨论】:

    标签: .net excel


    【解决方案1】:

    “Excel 应该是唯一使用它的东西”:

    I found out the hard way 可能实现此应用程序限制的唯一方法是hackish 或cryptic。 AFAIK:保留您的库引用的调用应用程序白/黑名单的硬编码或外部列表,并在每个库加载时执行查找。从本质上讲,COM 类向全世界公开...literally

    “是否有办法让公式中的直接调用和通过 VBA 的调用都使用单个单例的 Test 实例?”

    您必须将其视为单例,要么非常努力地仅使用一个实例,要么制作一个“单例包装器”函数来保存一个静态变量,该变量在您的 VBA 代码中保存对象引用。

    “如果那个 Test 类在类级别持有资源(即静态资源),你应该何时以及如何处置它们?”:

    它们(通常)在应用程序终止时自动清理,或者当应用程序调用 COM object's 'finalize' method (if applicable to the internal workings of the COM class's library),或者当对象的引用计数 drops to 0 (if applicable to the internal workings of the COM class's library) 时自动清理。

    我认为一个可能提供更好见解的问题是:“我正在使用的特定 COM 类如何处理它自己的生命周期?”有时 COM 对象是永久的,甚至远远超出调用应用程序中过程的结尾。根据 COM 类设计,无论调用应用程序中是否有任何剩余的引用对象,都可以使对象保持活动状态。有时,您需要显式销毁对象引用(使用 VBA 的“删除”方法),否则只要调用应用程序执行此操作,对象就可以持续存在(可能是该特定 COM 类的设计者所希望的)。从一个网站到另一个网站的 ActiveX 对象的持久性令人痛苦地证明了这一点,这也是为什么在浏览网络时最好“不信任任何人”的主要原因之一。更糟糕的是,如果永久对象本身在内部引用其他对象和资源。

    要真正掌握课程的生命周期,您必须研究 COM 课程作者提供的文档。在这种情况下,您需要在您的 COM 类库中设计一种方法来强制执行或提供外部可访问的方法来强制执行生命周期标准(实现 IDisposable、提供您自己的公共 Dispose() 方法等)。

    DLL 的引用链接在调用应用程序的整个生命周期内肯定会保持活动状态,甚至在您尝试创建第一个对象的那一刻诞生。 AFAIK,您对此无能为力。仅通过使用某些 3rd 方系统信息应用程序监视 DLL 应用程序所有权信息就可以看出这一点。这是有道理的,因为它节省了每次需要时加载和卸载 DLL 的资源。

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 2010-09-15
      • 2011-05-09
      • 2016-12-03
      • 2021-04-16
      • 1970-01-01
      • 2020-10-15
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多