如何用WixSharp为Visual Studio C# WPF项目创建含.NET4.6检测的安装程序
用WixSharp为WPF应用创建带.NET 4.6检测的安装程序
别担心,第一次做安装程序确实会有点无从下手,我一步步带你实现这个需求,每一步都尽量讲得直白易懂。
一、准备工作
首先得把基础环境和资源准备好:
- 安装WixSharp NuGet包:在你的Visual Studio项目(建议新建一个控制台项目来编写安装脚本,方便调试)里,打开NuGet包管理器,搜索并安装
WixSharp和WixSharp.UI这两个包——前者是核心库,后者提供可视化安装界面。 - 下载.NET 4.6离线安装包:下载.NET Framework 4.6的离线安装包(文件名一般是
NDP46-KB3045557-x86-x64-AllOS-ENU.exe),把它放到项目的Resources文件夹下,然后在文件属性里设置「复制到输出目录」为「始终复制」,这样生成安装包时会把它打包进去。
二、核心实现步骤
1. 编写.NET 4.6检测逻辑
我们通过查询Windows注册表来判断.NET 4.6是否已安装——因为.NET Framework的版本信息会存在注册表的固定位置。
using Microsoft.Win32; using System; private static bool IsNet46Installed() { // .NET 4.x的版本信息存在这个注册表路径下 const string netRegistryPath = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"; // 同时检查32位和64位注册表视图 using var registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) .OpenSubKey(netRegistryPath); if (registryKey != null && registryKey.GetValue("Release") != null) { // .NET 4.6对应的Release版本号是394802及以上(不同系统版本可能略有差异,取最低值即可) int releaseVersion = (int)registryKey.GetValue("Release"); return releaseVersion >= 394802; } return false; }
2. 整合安装流程(检测+自动安装.NET+应用安装)
接下来编写WixSharp的安装脚本,把检测逻辑和.NET安装流程整合进去,同时保留用户交互的步骤(让用户点击下一步启动.NET安装,完成后再继续)。
using WixSharp; using System.Diagnostics; using System.Windows.Forms; using System.IO; using System; class Program { static void Main() { // 定义你的WPF应用安装项目 var project = new Project("我的WPF应用", // 指定应用安装目录,这里是默认程序文件夹下的自定义路径 new Dir(@"%ProgramFiles%\我的公司\我的WPF应用", // 添加你的WPF应用主程序和相关依赖文件 new File(@"..\MyWpfApp\bin\Release\MyWpfApp.exe"), new File(@"..\MyWpfApp\bin\Release\MyWpfApp.dll"), // 其他需要打包的资源、配置文件等... )); // 设置安装包的基本信息 project.Version = new Version("1.0.0.0"); project.LicenceFile = @"License.rtf"; // 如果需要许可证文件的话 project.Package.Attributes.Add("InstallPrivileges", "elevated"); // 要求管理员权限,因为安装.NET需要权限 // 自定义安装前的动作:检测.NET 4.6,未安装则自动安装 project.BeforeInstall += (sender, e) => { if (!IsNet46Installed()) { // 提示用户即将安装.NET,点击确定开始 MessageBox.Show("检测到您的设备未安装.NET Framework 4.6,请点击确定开始安装。安装完成后,请回到安装界面点击下一步继续应用安装。", "需要安装.NET Framework 4.6", MessageBoxButtons.OK, MessageBoxIcon.Information); // 获取.NET安装包的路径(因为我们之前设置了复制到输出目录,所以路径可以这么写) string netInstallerPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "NDP46-KB3045557-x86-x64-AllOS-ENU.exe"); // 启动.NET安装程序,使用静默参数(/q是静默安装,/norestart是安装完成不自动重启) var installProcess = Process.Start(new ProcessStartInfo(netInstallerPath, "/q /norestart") { UseShellExecute = false, WaitForExit = true // 等待.NET安装完成 }); installProcess.WaitForExit(); // 安装完成后再次检测,如果还是没装上,就取消应用安装 if (!IsNet46Installed()) { MessageBox.Show(".NET Framework 4.6安装失败,无法继续应用安装,请手动安装后重试。", "安装失败", MessageBoxButtons.OK, MessageBoxIcon.Error); e.Cancel = true; // 终止安装流程 } } }; // 生成MSI安装包 project.BuildMsi(); } // 把刚才的检测方法放到这里 private static bool IsNet46Installed() { const string netRegistryPath = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"; using var registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) .OpenSubKey(netRegistryPath); if (registryKey != null && registryKey.GetValue("Release") != null) { int releaseVersion = (int)registryKey.GetValue("Release"); return releaseVersion >= 394802; } return false; } }
3. 调整UI流程(可选)
如果默认的WixUI界面不符合你的需求,你可以用ManagedUI来自定义对话框流程,比如添加一个专门的提示步骤,引导用户操作。不过上面的代码已经用MessageBox实现了基础交互,足够满足你的需求,新手可以先从这个版本入手。
三、测试与注意事项
- 测试场景:找一台没有安装.NET 4.6的机器,运行生成的MSI,验证是否会弹出提示,自动安装.NET,完成后继续应用安装;再在已安装.NET 4.6的机器上测试,确认直接进入应用安装流程。
- 权限问题:安装程序必须以管理员身份运行,否则无法修改注册表和安装.NET,所以一定要设置
InstallPrivileges为elevated,或者在项目的manifest里设置「requireAdministrator」。 - .NET安装参数:
/q是完全静默安装,不会显示安装界面;如果想让用户看到.NET的安装进度,可以把参数改成/passive,这样会显示进度条但不需要用户操作。根据你的需求选择即可。
内容的提问来源于stack exchange,提问作者ATTAFI Billel Abd Rezak
相关产品推荐
相关产品推荐

