手动运行用户运行的msi文件。在大多数情况下,他们需要能够选择安装目录,但是我们需要禁止某些安装位置。例如。将其安装到根目录C:\
将导致各种问题,因此我们需要覆盖该决定(即用C:\
覆盖C:\Program Files (x86)\xxx
)或弹出错误。有什么方法可以强制执行吗?
有问题的msi已经有自定义操作,但似乎没有办法从那里编辑安装位置。
或者,这种情况下的msi包含在一个WiX包中,所以如果我们可以禁止那里的某些目录也是好的。但是找不到这样做的方法(只知道如何使用<Variable Name="InstallFolder" ...>
编辑默认值)
只有我能想到的其他解决方案才会非常糟糕:创建一个单独的应用程序,选择一个目录,然后运行带有可接受目录的安装程序。
可以通过msi或WiX Bundle来完成吗?
我使用“Visual Studio 2013安装程序项目”扩展来构建msi。
答案 0 :(得分:3)
作为相反的观点:
总的来说,这是一个坏主意。在大多数情况下,正确的答案是将应用程序代码安装到相应的Program Files文件夹(64位或x86),将数据文件安装到数据位置等等,用户应该没有选择。我不清楚,当(例如)Windows认证规则说您的代码必须转到Program Files位置时,选择是一个好主意,所以只要做得对。用户只关心已安装的应用程序是否正常工作,如果安装到某些位置时失败,则答案是1)修复应用程序以使其正常工作或2)使用程序文件并让用户别无选择。
此外,如果您使用的是Visual Studio Installer项目,那么您无法编写自定义操作来执行此操作,因为它们都运行得太晚而无法更改安装位置。你似乎已经发现了这一点。但您可以隐藏浏览文件夹对话框并安装到默认的正确位置。
另一个问题是,您不清楚如何定义&#34;允许&#34;地点。如果它不是C:\,那么可以是D:\ SomeOtherLocation吗?可以连接USB驱动器吗?可以是网络共享,例如\\ Servername \ share吗?映射驱动器到网络共享?在运行时,可能会有任意数量的选定位置无法通过安装或应用程序运行,我不认为可以提供有用的列表。最重要的是,让我们说你有一个32位安装,用户在64位系统上选择本机Program Files文件夹,然后它甚至不会去那里 - 它将被重定向到程序文件(x86)位置。最后,我们不清楚你在静默安装模式下做了什么,假设用户在命令行上指定了一个位置,它没有通过你的测试,那么安装就会无声地失败(因为安静意味着安静,安装可能无人值守) 。
换句话说,只需安装到Program Files并完成它。
答案 1 :(得分:1)
自定义操作 :这会很短。稍后再回来查看。我不能说我最近一直在努力实现这一点,但是自定义操作当然可以检查安装位置并中止设置或停止它 - 如果发现选择的路径不令人满意。还应该注意的是,由于Directory表的实现方式,MSI主动拒绝直接安装到C:\
的根目录和类似的东西。
GUI :我猜一种方法是在用户点击设置的目标路径自定义对话框中的Next
按钮时运行自定义操作在检查路径方面做“无论你想要什么”,然后报告任何错误。这涉及DoAction event
连接到路径自定义对话框中的OK
或Next
按钮。
静默模式 :您还可以挂接相同的自定义操作以在静默模式下运行(或调用相同路径检查功能的其他自定义操作) - 占用事实上,也可以为静默安装指定不合需要的路径。在这种情况下,自定义操作应该在写入日志文件后中止设置,而不是向用户报告路径问题 - 这是您将从上面提到的对话事件中执行的操作 - 显然。
Github :我没有WiX代码供您在此计算机上实现此功能。我会点击github.com并搜索其他使用WiX的项目 - 你可能会很快找到一些东西 - 没有钱和WiX免费。
答案 2 :(得分:0)
根据用户能够手动安装它(因此使用UI序列),可能更容易:
在InstallUISequence中,将LaunchCondition操作排序到ExecuteAction操作之前。
然后在LaunchCondition表中添加如下条件:
<强>条件:强> TARGETDIR~&lt;&lt;“C:\ Program Files \”
说明强> 您必须安装到Program Files文件夹
我们在条件中说的是:
如果TARGETDIR以“C:\ Program Files \”开头(因此用户可以安装在此文件夹下的任何位置)继续安装。否则抛出错误。
而不是阻止某些位置,我可能只是强制执行Program Files文件夹作为最佳实践。