14

私は、Access、Excel、Word、PowerPoint、Outlookなどの複数のMicrosoftOffice製品に大きく依存するアプリケーションを開発しています。相互運用性について調査していると、VS2010と.NET 4から、ありがたいことに、PIAの悪夢を経験する必要がなくなったことがわかりました。

さらに、私は物の適切な処分に関する多くの記事を読んでいますが、最も賢明なものはこれであるように思われまし

ただし、この記事は5年前のものであり、AFAIKという主題に関する権威ある出版物は多くありません。上記のリンクからのコードのサンプルは次のとおりです。

' Cleanup:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()

Marshal.FinalReleaseComObject(worksheet)

oWB.Close(SaveChanges:=False)
Marshal.FinalReleaseComObject(workbook)

oApp.Quit()
Marshal.FinalReleaseComObject(application)

私が知りたいのは、今日の基準によるものです。これはどれほど正確であり、今後数年間アプリケーションをサポートする予定がある場合は、何に注意する必要がありますか?

更新:いくつかの信頼できる記事へのリンクをいただければ幸いです。ちなみに、これはサーバー側のアプリケーションではありません。これは、ユーザーがインスタンス化するオフィス製品と対話するコンピューターラボで実行されます。

見つけた: この3部構成の記事は、おそらく私が見つけたいと思う権威あるアカウントに最も近いものです。

4

3 に答える 3

3

オブジェクトがスコープ外になった後、オブジェクトはGCによって自動的に破棄される必要があります。それらをより早くリリースする必要がある場合は、Marshal.ReleaseComObjecthttp://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspxを使用できます

于 2012-05-10T16:08:52.137 に答える
2

特にMSOfficeCOMオブジェクトでCOMオブジェクトを完全に解放する場合は、親オブジェクト内にある、使用する必要のあるサブオブジェクトを解放することを強くお勧めします。

あなたの例では、セル、範囲、または他のオブジェクトが属するワークシートを解放する前に、使用した可能性のある他のオブジェクトをすべて解放します。

于 2012-05-10T16:34:22.733 に答える
2

相互運用機能を介して制御しているOfficeのバージョン、およびサーバーで発生する状況によっては、はい、Officeアプリケーションの1つの実行中のインスタンスを取り除くためにいくつかの深刻な畳み込みを行う必要がある場合があります。予測できない(そして不要な)ダイアログがあります。たとえば、Wordは対話型でない場合に開きます(Officeアプリケーションはいずれも無人実行用に特に適切に設計されていないため、最新バージョンをインストールしていない場合でも、サーバー側での使用)。

サーバーケースの場合は、Officeやその他の代替手段ではなくAsposeのスタックを使用することを検討してください。インタラクティブなローカルユースケースでは、Officeオートメーションサーバーは特に動作の悪いアンマネージドオブジェクトであるため、場合によっては「非常に強力な殺害」が必要になることがあります。

于 2012-05-10T16:29:00.240 に答える