2

基本的にユーティリティクラスなので、静的にする方が理にかなっていると思うクラスがあります。このクラスの一部として、私はMicrosoftAccessおよびMicrosoftExcelと相互運用しています。

明らかに、Office相互運用機能オブジェクトは管理されていないリソースであり、静的クラスにデストラクタを含めることはできません。データベースとワークブックを閉じ、エラーを適切に処理するように注意しながら、オブジェクトのインスタンスを1つだけにし、さまざまなメソッドで使用できるオブジェクトExcel.Applicationのインスタンスを1つだけにするのは理にかなっていると思います。Access.Application

プログラムを閉じると問題が発生します。実行しないSystem.Runtime.InteropServices.Marshal.ReleaseComObject("myOfficeApplicationInstance");と、Officeインスタンスがタスクマネージャーでハングします。アプリケーションの実行中にオブジェクトを解放すると、再び使用できなくなります。

それがすべて理にかなっているかどうかわからないので、いくつかのコードを以下に示します。

using System;
using Excel = Microsoft.Office.Interop.Excel.Application;
using Access = Microsoft.Office.Interop.Access.Application;

namespace QWERTY
{
    internal static class CreateReport
    {
        private static readonly Excel _excel;
        private static readonly Access _access;

        static CreateReport()
        {
            _excel = new Excel();
            _access = new Access();
        }

        internal static void Performance(DateTime reportDate)
        {
            _excel.Workbooks.Open(@"C:\whatever.xlsx");

            //Do stuff with Excel

            _excel.Workbooks.Close();

            _access.OpenCurrentDatabase(@"C:\whatever.accdb");

            //Do stuff with Access

            _access.CloseCurrentDatabase();
        }
    }
}

いくつかの質問

  1. これは静的クラスでなければならないというのは正しいですか?
  2. 静的クラスの使用を終了したときに、管理されていないリソースを処理するにはどうすればよいですか?
4

4 に答える 4

2

静的ファイナライザーはありません(ここを参照)。クラスを静的にしたい場合は、アプリケーションの最後に呼び出すメソッドをクリーンアップするためのメソッドも追加します。

別の方法(私が好む)は、シングルトンインスタンスを用意し、アプリケーションの最後でこのインスタンスをクリーンアップすることです。

必要に応じて、インスタンスにアクセスするための静的プロパティを設定することもできます。静的プロパティの代わりに、単一のインスタンスを作成するように構成した何らかの形式のDIを使用することもできます。ほとんどのDIはシングルトンスコープを提供します。

于 2012-09-14T08:36:28.713 に答える
2

静的な方法で実行したい場合は、CriticalFinalizerObjectクラスを継承するクラスを実装します。静的クラスのクリーンアップをファイナライザーに配置し、そのクラスの1つのインスタンスを静的クラスのフィールドとして追加します。次に、アプリが終了するか、アプリドメインがアンロードされると、そのインスタンスファイナライザーが実行され、静的クラスがまとめられます。

于 2012-09-14T10:45:00.757 に答える
1

The best way to deal with unmanaged resources is to wrap them in a class that implements IDisposable. You should then use that class in a using block to ensure proper cleanup. Since all classes that contain IDisposable members should be IDisposable themselves it follows that setting them as a static class members is not a great idea.

You can always release them when your application is exiting, yo do have that event.

Are you sure that you cannot open Excel twice inside your application?

于 2012-09-14T08:30:12.977 に答える
0

申し訳ありませんが、ExcelとAccessはIdisposableインターフェイスを実装していないため、OfficeInteropオブジェクトは管理対象リソースと見なされます。

Excel.Quitステートメントを使用してアプリケーションを適切に閉じようとしましたか?あなたが投稿したコードには表示されません。

于 2015-03-29T15:11:38.743 に答える