2013-02-28 4 views
3

Я пытаюсь проверить, если компьютер имеет распространяемый VC++ установлен и лучший способ я нашел, чтобы проверить это, выполнив следующий код:Stop установка на основе критериев

bool CheckForVCRedist() 
{ 
    bool install = false; 

    if (!install) install = 5 == MsiQueryProductState("{196BB40D-1578-3D01-B289-BEFC77A11A1E}"); 
    if (!install) install = 5 == MsiQueryProductState("{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}"); 
    if (!install) install = 5 == MsiQueryProductState("{C1A35166-4301-38E9-BA67-02823AD72A1B}"); 
    if (!install) install = 5 == MsiQueryProductState("{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}"); 
    if (!install) install = 5 == MsiQueryProductState("{1D8E6291-B0D5-35EC-8441-6616F567A0F7}"); 
    if (!install) install = 5 == MsiQueryProductState("{88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}"); 

    return install; 
} 

[DllImport("msi.dll")] 
private static extern int MsiQueryProductState(string product); 

Если какой-либо из следующие верно, тогда моя программа будет работать правильно. Я пытаюсь организовать его так, чтобы установщик останавливался на основе наличия VC++ Redistributable. В файле cs installer программы есть следующий код:

protected override void OnBeforeInstall(IDictionary savedState) 
{ 
    if (CheckForVCRedist()) 
    { 
     base.OnBeforeInstall(savedState); 
    } 
    else 
    { 
     throw new Exception("You are missing the VC++ 2010 Redistributable. Please follow the link to get it:\nhttp://www.microsoft.com/en-us/download/details.aspx?id=5555"); 
    } 
} 

Это не работает. Любой совет?

Редактировать: У меня нет настраиваемого действия, чтобы запустить это, поскольку я думал, что переопределение метода было правильным способом ... Теперь я чувствую, что это неправильно.

Редактировать [2013-02-28 10:36]: Ошибка не возникает в программе установки, есть ли лучший способ остановить установку программы установки?

+0

Вы пробовали любую отладку? Когда вы говорите, что это не работает, не удается ли правильно установить VC++? –

+0

Ну, единственный способ, которым я могу проверить, - это установить программу, и я не получаю никакой ответ на компьютер, который не имеет VC++ Redistributable. Я попробую добавить окно сообщения в действительную часть установки. –

+0

Заброшенное исключение должно быть обработано каким-то образом. В противном случае он может терпеть неудачу (возможно?). Не могли бы вы проверить свой журнал событий на наличие ошибок? –

ответ

2

Вы должны создать CustomAction, а затем переопределить Install. После этого вы можете сделать установку отменить бросая InstallException

public override void Install(System.Collections.IDictionary stateSaver) 
{ 
    if (CheckForExceptionalCondition()) 
     throw new InstallException("Some message for user."); 

    base.Install(savedState); 
} 

Затем он показывает дружественное окно сообщения во время установки и отменяет установку.

enter image description here