2013-11-15 84 views
0

真的不知道我可以用這個做,但希望有人也許能夠幫助強制進程​​關閉時,COM對象被銷燬

基本上,我已經開發了通過桌面的會計制度交換信息系統COM接口

我所做的是增加了對COM庫的項目引用我的.NET項目,然後在我的代碼創建一個新的實例

Dim myObject as New AccountingLibraryType 

然後,這讓我獲得了可見性質,程序和功能等

myObject.Login("Login details go here") 

這部分的所有工作正常,當我完成我的對象的實例工作

我的問題開始。無論我做什麼,我經常與進程仍在運行

當我放棄我的對象我這樣做

myObject.Logout 'As per Accounting software developers, should close process 
GC.Collect() 
Marshel.ReleaseComObject(myObject) ' Also tried Marshal.FinalReleaseComObject(myObject) 
myObject = Nothing 
即使在這一切的過程中仍然留在我的任務管理器運行

結束。

我調查了通過ProgID獲取流程,但不幸的是最終用戶通常會直接在會計軟件中工作,我無法確保我獲得正確的流程。

據我所知,com對象上沒有任何東西可用來標識它的進程。 我發現我能得到的屬性集,但同樣沒有看到反正從得到正確的處理

Dim attributes As AttributeCollection 
attributes = TypeDescriptor.GetAttributes(GetType(AccountingLibraryType)) 

所以首先,我還有什麼可以做,以確保過程完全第二,是否有更好的方法可以創建我的對象實例,我可以在該過程中獲得某種形式的句柄,但仍然可以訪問可見的屬性和方法。我已經看了Process和StartInfo,但並沒有真正看到如何獲得所需的方法等

我懷疑,如果會計軟件存在內部垃圾收集問題。我已經多次與他們交談過,但他們不願意做任何事情。

欣賞任何幫助

+0

應該說,我已經爲此實現了IDisposable自己的封裝類。在Sub Dispose中我正在清理我的對象引用。 – Hursey

回答

0

這是你要找的內容:

Marshal.FinalReleaseComObject(myObject) 
myObject = Nothing 
GC.Collect() 
GC.WaitForPendingFinalizers() 
GC.Collect() 

你也必須確保沒有孩子COM對象必須予以銷燬 - 如果在這樣摧毀它們相反的順序。

+0

感謝您的超級快速回復唐。根據您的指示更改我的清理代碼,不變。 – Hursey

+0

任何顯而易見的識別子com對象的方法? – Hursey

+0

找到了它,你在哪裏與孩子對象完全正確。有一個函數將一個sql查詢傳遞給它,並以com對象的形式返回一個數據集 – Hursey