【发布时间】:2012-08-30 15:56:11
【问题描述】:
我遇到了一个问题,我似乎无法在互联网上的任何地方找到答案。我有一个在 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(我没有选择 office 版本),我认为 64 位版本的 InfoPath 可能存在一些可能导致此问题的问题。
编辑 2:这不是 64 位版本的问题。我切换了我的 Office 版本并使用 Office 2010 x86 重新编译,但仍然遇到与以前相同的错误。
【问题讨论】:
标签: vb.net interop com-interop infopath infragistics