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

时间:2011-09-21 10:15:44

标签: c# ajax com service interop

我用OPC服务器编写XML AJAX服务。基于this示例的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中重建我的解决方案(在app路径中替换的文件)时,我得到了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 个答案:

答案 0 :(得分:5)

根据MSDN documentation

  

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

这意味着,如果group与您的OpcGroup实例(看起来非常可能)同时可以收集,那么group可能已经最终确定这很容易成为你失败的原因。

看起来你来自C ++背景,在这种情况下你应该意识到终结者在C#中的工作方式不同 - 你需要实现终结者的非常罕见。我建议您不要在终结器中进行清理,而是实现IDisposable,并在处理对象时执行此操作。

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