Определите, установлено ли исправление, используя Microsoft.Deployment.WindowsInstaller.PatchInstallation

Я думал, что это будет довольно просто, но у меня возникли проблемы с использованием класса PatchInstallation, который является частью Microsoft.Deployment.WindowsInstaller.

Получив правильный код исправления и код продукта (targetcode), я просто вызываю свойство IsInstalled, но выбрасываются ArgumentNullExceptions.

PatchInstallation patchInstallation = new PatchInstallation(patchCode.ToString("B"), productCode.ToString("B"));
return patchInstallation.IsInstalled;

Текст исключения:

Произошло исключение System.ArgumentNullException. Сообщение = значение не может быть нулевым. Имя параметра: String Source=mscorlib ParamName=String
StackTrace: at System.Number.StringToNumber(String str, параметры NumberStyles, NumberBuffer& number, информация NumberFormatInfo, Boolean parseDecimal) at System.Number.ParseInt32(String s, стиль NumberStyles, Информация о NumberFormatInfo) в Microsoft.Deployment.WindowsInstaller.PatchInstallation.get_State() в Microsoft.Deployment.WindowsInstaller.PatchInstallation.get_IsInstalled() InnerException:

Если у кого-то есть идеи, что я делаю неправильно, пожалуйста, дайте мне знать! Ваше здоровье!


person Ben Cawley    schedule 28.11.2012    source источник


Ответы (1)


Вы должны выбрать контекст, прежде чем сможете получить состояние патча. Используйте конструктор с четырьмя аргументами, который принимает UserContexts и выбирает один из UserManaged, UserUnmanaged или Machine.

person Bob Arnson    schedule 28.11.2012
comment
Я уже пробовал использовать конструктор с четырьмя аргументами, передавая userSid и UserContext. Я передаю null для userSid и пробовал All, UserManaged, UserUnmanaged и Machine. Все с одним и тем же результатом исключения аргумента null при доступе к свойству IsInstalled. Мне кажется, что в конструкторе отсутствует параметр для PatchStates. - person Ben Cawley; 29.11.2012
comment
Если пользовательский контекст отличается от UserManaged, UserUnmanaged или Machine, DTF использует функцию MSI API, которая не поддерживает получение состояния исправления. Однако существует множество ошибок, которые DTF игнорирует и вместо этого возвращает null. Я бы предложил выполнить отладку через вызов DTF, чтобы вы могли напрямую увидеть код ошибки. - person Bob Arnson; 30.11.2012