C# 无法使用已与其基础RCW分离的COM对象

C# 无法使用已与其基础RCW分离的COM对象,c#,ajax,com,service,interop,C#,Ajax,Com,Service,Interop,我正在用OPC服务器编写XML AJAX服务。基于示例的XML AJAX服务。 我的服务只有一个属性: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 下一步我将创建类析构函数: ~BoilerService() { try { ReadTimer.Dispose(); group.ReadCompleted -= new ReadCompleteEventH

我正在用OPC服务器编写XML AJAX服务。基于示例的XML AJAX服务。 我的服务只有一个属性:

[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。”。 2. 'System.Runtime.InteropServices.UCOMIConnectionPointContainer'已过时:“请改用System.Runtime.InteropServices.ComTypes.IConnectionPointContainer。”

出现此错误可能是因为此警告的原因吗?

根据

即使一个对象引用另一个对象,也不能保证两个对象的终结器以任何特定顺序运行。也就是说,如果对象A引用了对象B,并且两者都有终结器,那么当对象A的终结器启动时,对象B可能已经终结

这意味着,如果
与您的
OpcGroup
实例(看起来很可能)同时可供收集,则很可能是
已经完成,这很容易成为您失败的原因

看起来你是从C++背景来的,在这种情况下,你应该知道,在C++中,终结符的工作方式不同——它的<强>非常/强>你需要实现终结器。我建议您不要在Finalizer中执行此清理,而是实现

IDisposable
,并在处理对象时执行此工作


此外,您通常不需要取消钩子事件处理程序(除非该事件可能仍然被激发,并且在对象被释放后可能导致异常)。这类清理是为您处理的。

如何为我的服务类正确实现IDisposable?或者我必须更改OPC代码?如果你需要,我可以显示我的全部源代码。谢谢。我的服务只是OPC客户端。如果您想添加更多信息,请编辑您的问题,或者使用您收到的答案下的评论工具来讨论特定的答案。答案字段仅用于回答此问题,而不是讨论。