Я нашел замечательную функцию Powershell на GitHub, которая использует COM-объект WindowsInstaller.Installer для запроса установленных приложений и довольно красиво отображает все детали и свойства. Однако я не хочу использовать Powershell, я хочу создать exe.
Я не хочу искать в реестре и не хочу использовать WMI. Я хочу использовать тот же точный метод, который использовался в скрипте powershell, и другой найденный мной vbscript Существует COM-объект под названием WindowsInstaller.Installer. Он определенно существует, и все же по какой-то причине я не могу найти ни одного примера того, как он будет доступен после импорта msi.dll в Visual Studio с использованием C #.
Кто-нибудь знает ответ на этот вопрос?
В Visual Studio ссылка WindowsInstaller.Installer, добавляющая ссылку COM для WindowsInstaller, является просто типом и не более того. Он не содержит метода с именем «GetType», и попытка преобразовать этот PowerShell в C # работает неправильно.
Я также не знаю, что означает @{}
, но, думаю, это означает Hashtable.
Моя грустная попытка форсировать ситуацию ниже:
private void Form1_Load(object sender, EventArgs e)
{
Type installerType = Type.GetType("WindowsInstaller.Installer");
Installer installerObj = (Installer)Activator.CreateInstance(installerType);
WindowsInstaller.Installer installer = installerObj as WindowsInstaller.Installer;
var type = installer.GetType();
var Products = type.InvokeMember("Products", System.Reflection.BindingFlags.GetProperty, null, installer, null) as IEnumerable<object>;
foreach (var product in Products)
{
Hashtable hash = new Hashtable();
hash.Add("ProductCode", product);
string[] Attributes = { "Language", "ProductName", "PackageCode", "Transforms", "AssignmentType", "PackageName", "InstalledProductName", "VersionString", "RegCompany", "RegOwner", "ProductID", "ProductIcon", "InstallLocation", "InstallSource", "InstallDate", "Publisher", "LocalPackage", "HelpLink", "HelpTelephone", "URLInfoAbout", "URLUpdateInfo" };
foreach (var attribute in Attributes)
{
object[] thing = { product, attribute };
var details = type.InvokeMember("ProductInfo", System.Reflection.BindingFlags.GetProperty, null, installer, thing);
hash.Add(attribute, details);
}
new ??????????
}
}