インターネット上のどこにも答えが見つからないような問題に遭遇しました。Windowsフォーム内でInfopath.FormControlをホストするアプリケーションがあります。各InfoPathフォームには、表示する必要のある5つのビューがあり、Infragistics UI v11.1コントロールを使用して、アプリケーションの個別のタブに各ビューがあります。
アプリケーションは、選択した最初の4つのビューを正しく表示できます。選択した順序は関係ありません(例:1,5,4,2または1,2,3,4)が、4番目以降は1つは、「基になる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オブジェクトへの数百の参照を手動で追加しました。これらのことはどれも効果がありませんでした。常に4番目のビューの変更後、そのエラーが発生し、コードのすべての行をたどるとどこにも行き着きません。4番目のビューを設定してから上記のイベントが発生するまでの間に、常にCOMオブジェクトが失われます。この間、私が知っているコードは実行されていないので、この問題に悩まされています。
編集:これは.Net2から.Net4にアップグレードされるアプリケーションであり、InfoPath 2007を使用していた以前は完全に機能していました。現在、InfoPath 2010 x64を使用しています(オフィスは選択しませんでした)。バージョン)、そして私は、64ビットバージョンのInfoPathにこれを引き起こす可能性のあるいくつかの問題がある可能性があると考えています。
編集2:これは64ビットバージョンの問題ではありません。Officeのバージョンを切り替えて、Office 2010 x86で再コンパイルしましたが、以前と同じエラーが発生します。