0

インターネット上のどこにも答えが見つからないような問題に遭遇しました。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で再コンパイルしましたが、以前と同じエラーが発生します。

4

1 に答える 1

1

私はInfoPathへのCOMインターフェイスに精通していませんが、.Netから使用した他のすべてのCOMアプリケーション(Excel、WordなどのOfficeオブジェクトなど)では、次のエラーが発生します。

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

常に、アプリケーションオブジェクトが終了したことを意味します。これは通常、ホストされている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」テストに合格し、実際に使用しようとした場合にのみ失敗します。それ。

于 2012-09-10T18:49:53.673 に答える