2013-02-28 110 views
3

我想檢查如果計算機安裝了VC++可再發行,我發現來檢查它是通過運行下面的代碼的最佳方式:基於標準停止安裝

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文件中有以下代碼:

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++安裝嗎? – 2013-02-28 14:06:53

+0

那麼,我可以測試的唯一方法就是安裝程序,並且我沒有在沒有VC++ Redistributable的計算機上得到任何反饋。我會嘗試添加一個消息框到有效的安裝部分。 – 2013-02-28 14:09:10

+0

拋出的異常需要以某種方式處理。否則,它可能會失敗(也許?)。你能檢查你的eventlog是否有錯誤? – 2013-02-28 14:10:32

回答

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