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

时间:2012-08-30 15:56:11

标签: vb.net interop com-interop infopath infragistics

我遇到了一个问题,我似乎无法找到互联网上任何地方的答案。我有一个应用程序,在Windows窗体中托管Infopath.FormControl。每个InfoPath表单都有5个必须显示的视图,并且使用Infragistics UI v11.1控件,我们将每个视图放在应用程序的单独选项卡上。

应用程序能够显示您正确选择的前四个视图,并且选择它们的顺序并不重要(例如1,5,4,2或1,2,3,4),但是在第四个之后,它总是会出现错误"已经与其底层RCW分离的COM对象无法使用。"

Private Sub utForm_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles utForm.Click

    lastTabClicked = Me.utForm.SelectedTab.Text
    Me.OHeader1.Focus()
    ' If Me.formIsReadOnly Then
    If Me.fcInfoPath Is Nothing Or wasPrinted Then
        If Not Me.utForm.SelectedTab Is Nothing Then
            processReadOnlyTabChange(Me.utForm.SelectedTab.Text)
            Exit Sub
        End If
    End If

    'This is the line of code that will get the exception, but by the time we get
    'here, the COM object has already been released.
    Me.fcInfoPath.XmlForm.CurrentView.ForceUpdate()

    'Failed Ideas to stop the Com object from separating from it's wrapper (RCW)
    'Dim test As IntPtr = Marshal.GetIUnknownForObject(Me.fcInfoPath)
    'Marshal.AddRef(test)
    'GC.SuppressFinalize(Me.fcInfoPath)
    'SyncLock fcInfoPath for duration of event

    If Not Me.utForm.SelectedTab Is Nothing Then
        processTabChange(Me.utForm.SelectedTab.Key)
    End If
End Sub 

我已经深入研究了代码,它从不调用Marshal.ReleaseComObject或任何dispose方法。我还在FormControl对象上执行了GC.SuppressFinalize,并在更新视图的代码周围添加了一个SyncLock,以防出现线程问题。我甚至手动添加了数百个COM对象的引用作为最后的努力,因为COM对象应该只在删除最后一个引用后才释放。这些都没有任何影响。总是在第四次视图更改之后,它会出现该错误,并且跟随每行代码都无处可寻。在设置第四个视图和点击上述事件之间,它总是丢失COM对象。在我知道的这段时间里没有代码执行,所以我已经陷入了这个问题。

编辑:我还应该补充一点,这是一个从.Net 2升级到.Net 4的应用程序,在使用InfoPath 2007之前,它运行得很好。现在,它使用的是InfoPath 2010 x64 (我没有选择办公室版本),我认为64位版本的InfoPath可能会出现一些可能导致此问题的问题。

编辑2:这不是64位版本的问题。我关闭了我的Office版本并使用Office 2010 x86重新编译,我仍然得到与以前相同的错误。

1 个答案:

答案 0 :(得分:1)

我不熟悉InfoPath的COM接口,但在我从.Net(Office对象,如Excel,Word等等)使用的每个其他COM应用程序中,都有错误:

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

始终表示Application Object已退出,通常是因为它在托管的VBA引擎中抛出了未处理的错误。

AFAIK,您无法阻止应用程序对象退出使用.Net代码/调用。如果你有任何代码,我会检查你的代码隐藏。


实际上再次查看您的代码:

If Me.fcInfoPath Is Nothing Or wasPrinted Then
    ...
End If

'This is the line of code that will get the exception, but by the time we get
'here, the COM object has already been released.
Me.fcInfoPath.XmlForm.CurrentView.ForceUpdate()

    ...

很可能,甚至在您进行Me.fcInforPath Is Nothing ..测试之前,应用程序已经退出。处理.net / COM包装器时这是一个令人讨厌的问题,即使COM对象早已消失,.Net包装器对象仍然存在,因此它通过了这些“Is Nothing”测试,然后只有在您实际尝试使用时才会失败它