freizugeben ich unter ASP.NET 4.0 Framework den folgenden Code verwenden die Version der MSI-Datei aus einem Web-App zu erhalten:Wie COM Griff in .NET
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 = "";
}
Es funktioniert, außer dass feines der Code, wenn beendet, es hält ein internes MSI-Dateihandle, wenn ich versuche, die MSI-Datei zu verschieben oder umzubenennen, erhalte ich den Fehler, dass die Datei noch verwendet wird. Dies wird fortgesetzt, bis ich tatsächlich von der ASPX-Seite weg navigiere, die die obige Methode aufruft.
Meine Frage ist, habe ich offensichtlich keinen Griff oder Objekt im obigen Code geschlossen. Aber was könnte das sein?
PS. Ich teste es in einer Entwicklungs-IDE von VS2010.
EDIT: Bearbeitete den Code wie es nach Adriano Vorschlag sein sollte. Vielen Dank!
Führt eine der WindowsInstaller-Klassen IDisposable? Wenn dies der Fall ist, sollten Sie sie in Blöcken platzieren. –
Ich weiß ehrlich gesagt nicht viel über WindowsInstaller. Ich habe versucht mit "verwenden" und es ging nicht durch. Also ich denke, nicht ... – ahmd0
Windows Installer hat eine Win32-API und eine Automatisierungsschnittstelle (COM). Aus einer .NET-Perspektive ist die Win32 API viel sauberer als P/Invoke, dann die COM. Zusätzlich gibt es bereits eine Reihe von Klassen, um all dies für Sie zu kapseln. Siehe meine Antwort unten für weitere Informationen. –