In an application, I
have to call many functions of Excel for my financial and statistical
calculation. For this, I created an class named ExcelObject. This class has
static members like CalculateFInv which inturn calls Excel's function.
This code is running
successfully but with one issue. If the application exists abnormally (like I
stop execution during debugging), the instance of Excel objects keep running in
the memory. And when I run application again, it started a new instance. So I
got many instance of excel.exe running in the memory. At one time I found
twelve instances of excel.exe in the task manager. This had bad impact on the
performance and is practically unacceptable.
So I decide to fix
the issue. I created a static constructor of the class which checks if there is
any running instance of Excel.exe. If any instance of Excel.exe is running, it
uses this instance otherwise it creates new instance. It works fine even if Excel
application is open on the system, it uses the same instance. So effectively I
has only one instance of Excel.exe running at any time.
And here is the
entire code of the class.
using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using System.Diagnostics;
namespace Yanesh.Utilities
{
/// <summary>
/// This
class provides the functionality to call excel functions for distribution.
/// </summary>
public class
ExcelObject
{
static Excel.Application
excelApplication = null;
static ExcelObject()
{
try
{
excelApplication = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
}
catch (System.Runtime.InteropServices.COMException ex)
{
excelApplication = new Excel.ApplicationClass();
}
}
/// <summary>
/// Returns
the inverse of the F probability distribution using MS-Excel.
/// </summary>
/// <param name="arg1">probability</param>
/// <param name="arg2">Deg_freedom1</param>
/// <param name="arg3">Deg_freedom2</param>
/// <returns></returns>
public static
double CalculateFInv(double
arg1, double arg2, double
arg3)
{
return
excelApplication.WorksheetFunction.FInv(arg1, arg2, arg3);
}
}
}