我强烈建议看看Wix#。请参见
http://www.codeproject.com/Articles/31407/Wix-WixSharp-managed-interface-for-WiX。
另请参见CodePlex主页:
http://wixsharp.codeplex.com/
对于主要使用C#编码的开发人员,Wix#可能是最简单和舒适的技能集,它是免费的,并直接集成到Visual Studio环境中。我一直在VS2012和2013中成功使用它。
对于需要创建Windows Installer MSI以部署其应用程序的C#开发人员,Wix#或许是替换Microsoft从VS2012开始删除的“打包和部署”项目类型的最佳选择。Wix是WiX(Windows Installer Xml)工具集的C#前端。使用Wix#可以使用C#语言构建完整的Windows Installer MSI。
Wix#适用于广泛的安装/部署场景,并且在持续集成方案中表现得相当好。有关使用Wix#部署Windows桌面应用程序、安装Windows服务、安装ASP.NET网站以及许多其他类型的安装的示例。
Wix#处理典型的安装程序要求,对于简单项目的Wix#安装程序代码确实很简单。对于更复杂且需要高级功能的应用程序安装,Wix#可以在需要时利用完整的WiX工具集的强大功能。例如,在安装.NET应用程序时,典型的要求是在目标系统上安装应用程序exe和dll文件,并定制一些.NET配置文件和/或注册表项。
以下是一个简单的Wix#安装程序的C#代码示例,它在目标系统上安装应用程序并修改一些配置文件。此示例假定您编写了一个名为“TailorMyConfig.exe”的实用程序,例如,一个使用ConfigurationManager.AppSettings例程的简单的C#程序,并且您正在与您的应用程序一起部署此exe。
using System;
using System.Windows.Forms;
using System.Diagnostics;
using Microsoft.Deployment.WindowsInstaller;
using WixSharp;
class Script
{
static public void Main(string[] args)
{
var project = new Project("MyProduct",
new Dir(@"%ProgramFiles%\My Company\My Product",
new File(@"Files\Bin\MyApp.exe"),
new File(@"Files\Bin\TailorMyConfig.exe")),
new ManagedAction("UpdateConfigFile"));
project.Id = new Guid("6f330b47-2577-43ad-9095-1861ba25889b");
Compiler.BuildMsi(project);
}
}
public class MyCustomAction
{
[CustomAction]
public static ActionResult UpdateConfigFile(Session session)
{
if (DialogResult.Yes == MessageBox.Show("Config file update ready to run.\n Update config file(s) now?",
"Config Tailoring Utility",
MessageBoxButtons.YesNo))
{
Process.Start("TailorMyConfig.exe", "Run utility to tailor config file to current system");
}
return ActionResult.Success;
}
}
请注意,使用WiX XML功能修改配置文件有“更好”的方法。为简单起见,上面的示例假定使用自定义编写的C# exe实用程序来修改配置文件。我建议改用WiX XML功能来完成这项工作。您可以使用Wix#技术中的“XML注入”直接将几乎任何WiX XML功能合并到Wix#设置中。
请记住,Wix#只是发出WiX XML语法的C#前端。在Wix#发出WiX XML(wxs文件)之后,该wxs文件可以轻松地进行后处理以插入其他WiX XML功能。然后,WiX工具集将编译生成的wxs文件为MSI。
要了解如何使用XML注入将WiX XML功能合并到Wix#(C#)安装中,请参阅此处的示例
In Wix#, how to avoid creating a physical folder on the target system, when deploying only registry entries?。在那个问题中,请查看我的答案,它使用将委托钩接到“WixSourceGenerated”事件的技术。
您可以使用XML注入方法将一些WiX XML插入到安装程序中,以完成配置文件编辑。以下是一些典型的WiX XML示例,用于修改配置文件:
如何在安装过程中修改.NET配置文件?
另一个安装程序的典型要求是在目标系统上添加或修改Windows注册表项。Wix#提供了直接支持,使用“RegValue”类即可实现。使用Wix#的优点是,您还可以获得完整的“卸载”功能,包括将注册表项卸载/还原到预安装状态。这是Wix#构建在WiX Toolset和Windows Installer技术之上的自然结果。以下是一个仅包含注册表的Wix#安装程序示例:
在Wix#中,如何在部署仅包含注册表项时避免在目标系统上创建物理文件夹?
“Wix#”方法在我的环境中非常有用,它允许使用熟悉的C#技能集,而不必立即跳入WiX XML安装程序技术的全部复杂性中。第一个被接受的答案提倡这种方法:“一个好的策略是使用InstallShield LE作为简单容器,然后在WiX中完成大部分编写工作。我在我的博客中描述了这种模式:
http://blog.iswix.com/2011/01/augmenting-installshield-using-windows_19.html。”虽然这是一种很好的可行方法,但我在这里建议的方法具有以下优点:“使用Wix#加WiX的方法的优点”。
- 完全不需要处理 InstallShield LE 或其他专有的安装程序产品
- 大多数安装程序都是用 C# 代码编写的,这是一个熟悉的技能集
- 无需事先学习完整的 WiX 工具集环境;您可以从 C# 代码开始,然后在需要时添加高级的 WiX 功能,使用 XML 注入。
- 该方法在持续集成环境中运作良好,所有组件都适合在构建服务器上进行 XCopy 部署安装,所有组件都非常适合通过脚本自动化,例如 Powershell 脚本。
- 如果微软再次改变与 Visual Studio 捆绑的安装程序工具的方向,您将不会受到影响。
与 IS LE + WIX 相同的元素
- 基于WiX工具集的能力构建,因此所有WiX XML的功能都可以并入安装程序
- 许多关于WiX解决部署问题的优秀"How-to"在SO和其他地方都可以找到
- 生成真实的MSI Windows安装程序,包括卸载功能和该技术的所有出色功能。
- 当创建安装程序时,您将希望了解更多关于WiX和Windows Installer技术。高级功能通常需要进入WiX XML。
- 两者都或多或少无缝地集成到Visual Studio环境中。(如果有什么区别,Wix#方法可能会稍微有些优势)
因此,虽然另一种方法是可行的解决方案,但我建议在VS2012、VS2013、VS201x上采用Wix#+WiX工具集作为最少烦恼的路径。也许最大的优势是,无论Microsoft的营销经理做出何种后台交易来包括或撤销Visual Studio的部署技术,您都不太可能再次改变您的基础部署技术和方法,并遭受Microsoft的打击。