Я использую следующий код в рамках ASP.NET 4.0 для получения версии файла MSI из веб-приложения:
string strVersion = "";
try
{
Type InstallerType;
WindowsInstaller.Installer installer;
InstallerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
installer = (WindowsInstaller.Installer)Activator.CreateInstance(InstallerType);
WindowsInstaller.Database db = installer.OpenDatabase(strMSIFilePath, 0);
WindowsInstaller.View dv = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property`='ProductVersion'");
WindowsInstaller.Record record = null;
dv.Execute(record);
record = dv.Fetch();
strVersion = record.get_StringData(1).ToString();
dv.Close();
//db.Commit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(dv);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(db);
}
catch
{
//Failed
strVersion = "";
}
Он работает нормально, за исключением того, что когда код завершает работу, он содержит внутреннийДескриптор файла MSI, поэтому, когда я пытаюсь переместить или переименовать файл MSI, я получаю сообщение об ошибке, что файл все еще используется.Это продолжается до тех пор, пока я фактически не уеду от страницы ASPX, которая вызывает метод выше.
Мой вопрос, очевидно, я не закрывал какой-либо дескриптор или объект в коде выше.Но что это может быть?
PS.Я тестирую его в среде разработки от VS2010.
РЕДАКТИРОВАТЬ: Отредактировал код так, как это должно быть после предложения Адриано.Спасибо!