0

在我的设置应用程序中显示某些 UI 控件的条件之一是基于文件是否存在。

此检查无法通过自定义操作完成,因为即使 OnBeforeInstall 事件在安装后发生,并且我要更改的对话框在此之前显示。

如果我使用的是 WiX,它会很简单

<Property Id="FILEEXISTS">
   <DirectorySearch Id="CheckFileDir"
                 Path="[CommonAppDataFolder]Manufacturer\Product"
                 Depth="0">
      <FileSearch Id="CheckFile"
              Name="Filename.ext" />
   </DirectorySearch>
</Property>

没有 WiX 怎么办?

4

2 回答 2

1

您可以将 WiX 代码放入合并模块项目中,然后在设置项目中使用它。

Visual Studio 部署项目的赎回

FWIW,IMO,设置项目太可怕了。微软在 VS2012 中杀死了它,用户语音网站上有成千上万的人抱怨安装程序一无所知。

如果是我,由于您正在做自定义 UI 工作,我会花 2000 美元购买一份 InstallShield Professional 并采用使用 Windows Installer XML 的合并模块。当然,这一切都可以只使用 WiX 来完成,但节省的时间是物有所值的。

使用 Windows Installer XML 增强 InstallShield - 证书

于 2013-06-26T14:44:44.253 回答
0

您的 MSI 文件需要一个后期构建 JScript。或者您可以在 Orca 中手动完成。

var installer = WScript.CreateObject("WindowsInstaller.Installer");
var filespec = WScript.Arguments(0);
var msiOpenDatabaseModeTransact = 1;
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

Execute("INSERT INTO `AppSearch` (`Property`, `Signature_`) VALUES ('FILEEXISTS', 'CheckFile')");
Execute("INSERT INTO `DrLocator` (`Signature_`, `Parent`) VALUES ('CheckFile', 'CheckFileDir')");
Execute("INSERT INTO `DrLocator` (`Signature_`, `Path`, `Depth`) VALUES ('CheckFileDir', '[CommonAppDataFolder]Manufacturer\\Product', 0)");
Execute("INSERT INTO `Signature` (`Signature`, `FileName`) VALUES ('CheckFile', 'Filename.ext')");

function Execute(sql) {
    view = database.OpenView(sql);
    view.Execute();
    view.Close();
}
于 2013-06-26T12:04:46.963 回答