.NET通过COM调用的.NET自动化服务器的生命周期

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

一个附属的问题是,是否有一种方法可以直接调用公式和通过VBA调用使用一个单一的单例实例? 我想我已经知道如何让所有VBA程序使用单个Test实例,但是即使在公式中直接调用Test方法时也会创build第二个。

最后,如果这个Test类在课堂上拥有资源(即静态资源),何时以及如何处理它们呢? 同样,这也引发了.Net / COM Interop创build和销毁testing类的确切时间的问题。

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

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

我发现困难的方法可能是完成这个应用程序限制的唯一方法是hackish或神秘的 。 AFAIK:保存一个硬编码或外部列表的调用应用程序白/黑名单引用您的库,与每个库负载执行查找。 从本质上讲,COM类暴露于整个世界… 从字面上 。

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

你必须把它作为一个单例,通过非常努力地持续使用一个实例,或者使用一个“singleton wrapper”函数来保存一个静态variables,该variables在VBA代码中保存对象引用。

“如果这个testing类在课堂上拥有资源(即静态资源),何时以及如何处理它们? ”:

它们通常在应用程序终止时自动清理,或者当应用程序调用COM 对象的“finalize”方法(如果适用于COM类库的内部工作方式) ,或者当对象的引用计数降至0(如果适用于COM类库的内部工作) 。

我认为可能提供更好洞察力的问题是:“我使用的特定COM类是如何处理自己的寿命的? 有时COM对象是永久的,甚至远远超出了你的调用应用程序的一个过程的结束。 根据COM类的devise,不pipe在调用应用程序中是否有任何剩余的引用对象,都可以使对象保持活动状态。 有时你需要显式销毁对象引用(使用VBA的“删除”方法),否则只要调用应用程序可以保持该对象(可能由该特定COM类的devise者devise)。 这一点从网站到网站的ActiveX对象的持久性是非常明显的,也是浏览网页的主要原因之一,可能是“不信任任何人”。 更糟糕的是,如果永久对象本身在内部引用其他对象和资源。

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

到DLL的引用链接在调用应用程序的整个生命周期中一定会保持活动状态,在您尝试创build第一个对象的那一刻出现。 AFAIK,你无能为力。 这只是通过使用一些第三方系统信息应用程序来监视DLL应用程序所有权信息。 这是有道理的,因为它可以节省每次需要时加载和卸载DLL的资源。