基本的にユーティリティクラスなので、静的にする方が理にかなっていると思うクラスがあります。このクラスの一部として、私は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();
}
}
}
いくつかの質問
- これは静的クラスでなければならないというのは正しいですか?
- 静的クラスの使用を終了したときに、管理されていないリソースを処理するにはどうすればよいですか?