2010-07-11 69 views
7

與主題一樣,我編寫了一個C#類,稱爲Test,然後將其編譯爲DLL並將其作爲COM自動化服務器公開給Excel。現在,您可以直接在Excel公式中調用該類的方法,也可以通過VBA函數自行調用它們。在第二種情況下會發生什麼是相對透明的(您編寫代碼!),而在第一種情況下,我假設一個Test實例被透明地實例化然後使用(它必須由於暴露的方法不是,而且 - 從我讀過的內容 - 不能是靜態的),但確切的時間和方式不清楚。因此,我的問題是:在此設置中調用的自動化服務器的精確生命週期是什麼以及在哪裏記錄?從COM調用Excel自動化服務器的生命週期

一個附屬問題是,是否有一種方法可以使公式和直接調用通過VBA使用一個單獨的實例Test?我想我已經知道如何讓所有VBA過程使用單個Test實例,但即使如此,在公式中直接調用Test方法時也會創建第二個過程。

最後,如果Test類擁有類級別的資源(即靜態資源),何時以及如何處理它們?同樣,這引發了測試類是由.NET/COM Interop創建和銷燬的確切時間的問題。

精度:該服務是一個DLL,而不是應用程序,並且Excel應該是唯一使用它的東西,儘管可能有多個電子表格副本打開。這是Excel 2007中

回答

1

「的Excel應該使用它是唯一」:

I found out the hard way這可能是唯一的方式來完成這個應用程序的限制是hackish的或cryptic。 AFAIK:保留一個硬編碼或外部列表,調用您的庫引用的應用程序白名單/黑名單,並在每個庫負載上執行查找。本質上,COM類暴露於整個世界...... literally

「是否有方法使直接調用公式和通過VBA調用使用單個單例實例?

您必須將其視爲單例,要麼通過非常難以持續使用僅一個實例,要麼創建一個「singleton包裝器」函數來保存一個靜態變量,該變量在VBA代碼中保存對象引用。

「如果測試類在類級別(即靜態資源),擁有資源的時候,你應該如何處置他們的?」:

它們(通常)會自動在應用程序終止清理時間,或者當應用程序調用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'delete'方法),或者只要調用應用程序執行,對象可以持久化(可能由該特定COM類的設計者設計)。從網站到網站的ActiveX對象的持久性,這是很明顯的,也是瀏覽網絡時最主要的原因之一是「不信任任何人」。更糟糕的是,永久對象本身在內部引用其他對象和資源。

爲了真正掌握這個類的生命週期,你必須研究COM類作者提供的文檔。在這種情況下,您需要從COM類庫中設計出一種方法來強制執行或提供外部可訪問的方法來強制執行壽命標準(實現IDisposable,提供自己的公開方法等)。

在調用應用程序的整個生命週期中,DLL的引用鏈接在您嘗試創建第一個對象時即刻生效。 AFAIK,你無能爲力。這只是通過使用某些第三方系統信息應用程序監視DLL應用程序所有權信息來證明的。這是有道理的,因爲它可以節省每次需要時加載和卸載DLL的資源。