2010-06-15 139 views
2

我有一個COM對象,我們從C#調用。這很好,我有我自己的對象池,我可以隨時使用它。現在我需要殺死對象。我試過顯式地釋放COM對象,然後從另一個線程中進行垃圾收集,但是它什麼都不做。有沒有人有任何其他想法來殺死這個對象?謝謝您的幫助。從C中kill COM對象#

我已經試過

System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
myApp = null; 

,我通過

myApplication.ApplicationClass myApp = new myApplication.ApplicationClass(); 

創建它,這是完整的代碼 此COM對象是寫在VB6,下面是C#代碼調用VB6組件

 myApplication.ApplicationClass myApp = new myApplication.ApplicationClass(); 

     string user = this._User; 
     string pass = this._Pass; 
     string company = this.companyNumber; 

     try 
     { 
      if (myApp.Login(ref user, ref pass, ref company)) 

{ //執行一些操作 } else { throw new System.Exception(MESSAGE_LOGINERROR); } } 最後 { System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);

  GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      M2MApp = null; 

}

感謝, 普拉迪普

+0

ApplicationClass庫來自哪個庫?它是否包含在下面的Microsoft Excel/Word實例? – shahkalpesh 2010-06-15 06:21:21

+0

它不是一個excel或word組件,它是由我創建的一個活動的x dll。 – Pradeep 2010-06-15 06:26:25

+0

發佈訪問VFP數據庫的VB6代碼。這可能是你的VB6代碼鎖定了數據庫,而不是.net結尾的問題。 – shahkalpesh 2010-06-16 12:21:55

回答

0

確保,你沒有任何其他變量引用(持有引用)myApp

或者,撥打FinalReleaseComObject也可能有所幫助。
注意:我看了文檔&暗示這是一個替代。撥打此方法時請謹慎使用。

+0

沒有引用myApp的變量 – Pradeep 2010-06-15 06:36:27

+0

請發佈完整的代碼(如果可以的話)或一個示例應用程序來找出它,爲什麼它沒有發佈COM實例? COM對象引用了什麼?它是什麼類型(用vb6/vC++/delphi編寫)? – shahkalpesh 2010-06-15 06:40:17

+0

它是用vb6編寫的,代碼已經發布在 – Pradeep 2010-06-15 06:54:38

1

也許只是交換兩行,因爲對myApp是你引用你的對象: 或嘗試重複操作,直至爲零:

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp)>0) 
     ; 
myApp = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
+0

交換沒有幫助。 – Pradeep 2010-06-15 07:25:00

+0

對不起,我總是通過ReleaseComObject去除這些對象。 順便說一句,你叫'ReleaseComObject',直到它返回零? – 2010-06-15 12:11:27

0

我已經在過去類似的問題,並嘗試所有的東西你」已經提到,但無法解決它。最終,我不得不強制終止我的進程來終止COM對象。

0

爲了能夠徹底釋放你需要加載在一個單獨的AppDomain,你可以卸載你叫ReleaseComObject(),做其他適當的清理你的對象後,COM對象。

這已證明是我過去唯一可靠的方式。