2011-09-21 79 views
1

我正在使用OPC服務器編寫XML AJAX服務。基於this示例的XML AJAX服務。 我做了我的服務有一個屬性:已與其基礎RCW分離的COM對象無法使用

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

而且下一步我創建類的析:

~BoilerService() 
{ 
    try 
    { 
     ReadTimer.Dispose(); 
     group.ReadCompleted -= new ReadCompleteEventHandler(group_ReadCompleted); 
     group.Remove(true); 
     server.Disconnect(); 
    } 
    catch (Exception e) 
    { 
     System.IO.StreamWriter sw = new System.IO.StreamWriter("log.txt", true); 
     sw.WriteLine(DateTime.Now.ToString() +e.Message+ " "+ e.Source+" "+e.StackTrace + " destructor called."); 
     sw.Close(); 
     sw.Dispose(); 
    } 
} 

但是,當我重建我的解決方案在VS(替換應用程序路徑文件)我獲取wp3.exe未處理的異常錯誤窗口(Windows 7)。在Windows事件日誌中,我看到以下文本:

Exception: System.Runtime.InteropServices.InvalidComObjectException 

Message: COM object that has been separated from its underlying RCW cannot be used. 

StackTrace: at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, Boolean& pfNeedsRelease) 
    at OPC.Data.Interface.IOPCServer.RemoveGroup(Int32 hServerGroup, Boolean bForce) 
    at OPC.Data.OpcGroup.Remove(Boolean bForce) 
    at OPC.Data.OpcGroup.Finalize() 

我做錯了什麼?


和VS 2010人提出警告: 1 'System.Runtime.InteropServices.UCOMIEnumString' 已過時:「使用System.Runtime.InteropServices.ComTypes.IEnumString代替。 http://go.microsoft.com/fwlink/?linkid=14202'。 2.'System.Runtime.InteropServices.UCOMIConnectionPointContainer'已過時:'改爲使用System.Runtime.InteropServices.ComTypes.IConnectionPointContainer。 http://go.microsoft.com/fwlink/?linkid=14202'

可能是因爲此警告而出現此錯誤?

+1

如果您想添加更多信息,請編輯您的問題,或在您收到的答案下使用評論設施來討論具體的答案。答案字段僅供參考,回答這個問題,不討論。 –

回答

4

按照MSDN documentation

兩個對象的終結不能保證在任何特定的順序運行,即使一個對象指的是其他。也就是說,如果對象A具有對象B的引用並且都具有終結器,則當對象A的終結器開始時,對象B可能已經完成。

這意味着,如果group是符合要求的收集,同時爲您OpcGroup實例(這似乎很有可能),它很可能是group已經敲定這很容易成爲你失敗的原因。

看起來你是來自C++的背景,在這種情況下,你應該知道,終結者在C#中的工作方式不同 - 它很少需要實現最終程序。我會建議你不要在你的finaliser中做這個清理工作,而應該實現IDisposable,並在處理對象時做這個工作。

另外,您通常不需要解除事件處理程序的掛鉤(除非事件可能仍然會被觸發,並且可能在對象處置完畢後導致異常)。這種清理是爲你處理的。

+1

如何正確實現我的服務類的IDisposable?或者我必須改變OPC代碼?如果您需要,我可以顯示我的完整源代碼。謝謝。 – amaranth

+0

而我的服務只是OPC客戶端。 – amaranth

相關問題