2013-07-08 54 views
0

我想检查用户选择的安装目录是否为空(例如,他们不会尝试将应用程序安装到他们的桌面目录而不是文件夹在那里)。到目前为止,我已经有了一个自定义可执行文件,它会以非常令人困惑的错误消息来中止安装,在成本最终确定的地方。不过,我宁愿阻止用户继续过去自定义步骤。WiX:正在检查INSTALLDIR为空

没有任何相关的东西似乎在这里; wix-users @也有一些信息没有有用的答案。

+0

你打算在升级过程中改变目录? –

+0

不是;升级预计将在原地。我们目前正在使用基于非MSI的升级系统 - 无论如何,这有点糟糕,但这是众所周知的。 (我想我应该在问题中提到,我只希望在安装程序UI中进行额外检查;可以进行非交互式安装的人员应该足够聪明,不会在脚下自己拍摄。) – user5999744

+0

这是错误的在这么多层面上,我甚至都不会去碰它 –

回答

0

对于它的价值:最终在DLL中编写了一个WiX自定义操作,我可以访问安装会话并设置属性。丑陋的解决方案我仍然认为应该有内置的东西来做到这一点......我无法找到它。

对于有兴趣的人,相关变更集是here

0

我在一个DLL中使用了WiX自定义操作。下面是代码:

威克斯:

<Binary Id="CustomAction" SourceFile="$(var.SourceBinFolder)\MyCustomAction.CA.dll" /> 
<CustomAction Id="CheckFolderCustomAction" BinaryKey="CustomAction" DllEntry="CheckFolder" /> 
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" /> 

<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="CheckFolderCustomAction" Order="2">1</Publish> 
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="3">InstallDirOk = "1"</Publish> 

自定义操作:

public class CustomActions 
    { 
    [CustomAction] 
    public static ActionResult CheckFolder(Session session) 
    { 
     string installDir = session["INSTALLFOLDER"]; 
     installDir = installDir.Trim(); 
     session["InstallDirOk"] = "1"; 
     if (Directory.Exists(installDir) && Directory.EnumerateFileSystemEntries(installDir, "*", SearchOption.TopDirectoryOnly).Any()) 
     { 
     if (DialogResult.No == MessageBox.Show(
       string.Format("Selected folder \"{0}\" is not empty. This might cause existing files to be overwritten. Do you want to proceed?", installDir), 
       "Please confirm", 
       MessageBoxButtons.YesNo)) 
     { 
      session["InstallDirOk"] = "0"; 
     } 
     } 

     return ActionResult.Success; 
    } 
    }