我目前有一个使用WiX构建的.msi,它具有我非常满意的用户界面。唯一缺少的是检测缺少的.NET 4.5以及:
我以前使用的安装和部署项目只是将其添加为带有URL的LaunchCondition,并且运行良好。
如何在不诉诸引导程序的情况下将其添加到WiX安装程序。从我所知道的使用像烧录这样的引导程序需要重新实现一个新的用户界面,同样像dotNetInstaller这样的工具也会引入一个新的用户界面。
如果我可以让引导程序没有实现它自己的UI但触发.NET安装,那么打开msi的当前用户界面也会对我有用。
答案 0 :(得分:1)
要给你一个答案,我相信人们会投票,但我也想保留MSI的UI,所以我添加了这段代码来启动硬件密钥的exe安装程序。我知道这违反了MSI最佳实践,但这是我打算破解的唯一一个。希望这会有所帮助。
<Property Id="WixShellExecTarget" Value="[#myapplication.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
然后我通过点击按钮运行自定义操作。您可以生成一个带有下载按钮的错误对话框,并通过它进行链接。虽然不是很优雅,但它对我和我公司来说都是有用的工作.. :)
编辑:你也可以通过点击按钮来使用此代码来启动下载的URL,Value
属性具有完整的超链接。
答案 1 :(得分:1)
这是我最终使用的代码......尚未通过全面测试!
Product.wxs:
...
<!-- custom actions -->
<InstallUISequence> <!-- .NET dialog runs only in UI mode and we skip it on the wrong platform so platform condition test is triggered later -->
<?if $(var.Platform) = x64 ?>
<Custom Action="InstallCA" Before="LaunchConditions">(NOT REMOVE~="ALL") AND NOT (Installed OR NETFRAMEWORK45) AND VersionNT64</Custom>
<?elseif $(var.Platform) = x86 ?>
<Custom Action="InstallCA" Before="LaunchConditions">(NOT REMOVE~="ALL") AND NOT (Installed OR NETFRAMEWORK45) AND NOT VersionNT64</Custom>
<?endif?>
</InstallUISequence>
</Product> <!-- end product -->
<Fragment>
<Binary Id="WiXCustomActions" SourceFile="$(var.WiXCustomActions.TargetDir)$(var.WiXCustomActions.TargetName).CA.dll" />
<CustomAction Id="InstallCA" BinaryKey="WiXCustomActions" DllEntry="DotNetCheck" Execute="firstSequence" />
</Fragment>
自定义操作(在C#类库中):
[CustomAction]
public static ActionResult DotNetCheck(Session session)
{
try
{
MessageBoxResult result = System.Windows.MessageBox.Show(
"This application requires that .NET Framework 4.5 is installed." + Environment.NewLine
+ "Would you like to open the Microsoft download page for" + Environment.NewLine + ".NET Framework 4.5?",
".NET Framework 4.5 is missing",
MessageBoxButton.YesNo, MessageBoxImage.Information, MessageBoxResult.No, MessageBoxOptions.DefaultDesktopOnly);
switch (result)
{
case MessageBoxResult.Yes:
System.Diagnostics.Process.Start("http://go.microsoft.com/fwlink/p/?LinkId=245484");
break;
} //else just finish
}
catch (Exception ex)
{
session.Log("Error. " + ex.Message);
System.Windows.MessageBox.Show("Error:" + ex.Message);
}
return ActionResult.SkipRemainingActions;
}
它对我来说足够好......
答案 2 :(得分:0)
还有一件重要的事情,当你要创建这个DLL lib
时自定义操作(在C#类库中):
需要添加下一个参考文献:
using WixSharp
using Microsoft.Deployment.WindowsInstaller
using System.Windows.Forms
也取代&#34; MessegeBoxResult&#34; to&#34; DialogResult&#34;和MessegeBox应该从类System.Windows.Forms
获得