C# 以编程方式构建MSI
我想创建一个C#程序,该程序基于多个参数创建MSI。例如,根据用户设置,将包括某些文件,或设置运行时参数C# 以编程方式构建MSI,c#,visual-studio-2008,installation,C#,Visual Studio 2008,Installation,我想创建一个C#程序,该程序基于多个参数创建MSI。例如,根据用户设置,将包括某些文件,或设置运行时参数 有没有人能给我指一些可能有用的文档,或者给我一个从哪里开始的想法?我想看看。它有一个相当陡峭的学习曲线,但它将产生msi作为项目构建周期的一部分。如果你真的想在代码中这样做,你会想看看。但是,它构建了一个很好的托管工具集,这将使使用XML语言编写MSI更加容易。他们还将许多Windows Installer API包装在托管包装中,但要充分发挥Windows Installer的功能,您需要
有没有人能给我指一些可能有用的文档,或者给我一个从哪里开始的想法?我想看看。它有一个相当陡峭的学习曲线,但它将产生msi作为项目构建周期的一部分。如果你真的想在代码中这样做,你会想看看。但是,它构建了一个很好的托管工具集,这将使使用XML语言编写MSI更加容易。他们还将许多Windows Installer API包装在托管包装中,但要充分发挥Windows Installer的功能,您需要查看API文档。签出-一组C库,允许您用C代码表达安装。然后将其转换为WiX(XML)文件,然后对其进行编译和链接,以创建标准MSI(Windows Installer)文件。我一直在使用WixSharp(WiX#),原因如下所述。我发现XML驱动的安装程序太难看和不直观,无法处理,也就是说,将编辑XML文件作为构建安装程序的一种方式。我深入研究了基于C语言的WiX,认为它是一种更为平易近人的选择。在我的例子中,我需要生成一个MSI来在服务器上安装一个.NETDLL(不在GAC中),然后为COM互操作注册它 更多信息请访问Wix的CodePlex主页: 对于OP描述的安装类型,“功能”的MSI/WiX概念似乎适用,例如,用户可以选中一个框来安装或省略某些功能(“功能”可以是一组文件/程序、一组注册表项等) 在WiX安装程序中,您可以在C安装程序代码的顶部声明一个带有“ID”的“功能”,例如二进制文件、文档、注册表项等,然后在声明其他安装程序组件时引用该功能ID。(请参阅Wix安装附带的“示例”文件夹中的“AllInOne”Wix代码) 请注意,功能ID“binaries”如何成为声明文件和FileShortcut组件的第一个参数,即“new File(binaries…)并将这些组件链接到功能ID“binaries”中 此外,MSI安装程序允许您在命令行上指定功能ID,例如 msiexec/i install.msi ADDLOCAL=二进制文件 另请参见本帖: 虽然WiX可以查看目标系统并确定要安装什么,但我没有看到看起来直观的WiX示例,只有使用自定义操作(WiX支持)的潜在例外。使安装程序的行为适应目标系统的一种方法是使用自定义操作设置属性,如WiX示例中所示。”Wix部署中的“有条件安装”
//setting property to be used in install condition
new Property("INSTALLDESKTOPSHORTCUT", "no"),
new ManagedAction(@"MyAction", Return.ignore, When.Before, Step.LaunchConditions, Condition.NOT_Installed, Sequence.InstallUISequence));
在Wix#安装程序的前面链接回此代码:
new Dir(@"%Desktop%",
new ExeFileShortcut("MyApp", "[INSTALLDIR]MyApp.exe", "")
{
Condition = new Condition("INSTALLDESKTOPSHORTCUT=\"yes\"") //property based condition
}),
请注意,大括号中的“条件”被设置为测试属性“INSTALLDESKTOPSHORTCUT”的值“yes”,该值被设置为自定义操作的结果
public class CustomActions
{
[CustomAction]
public static ActionResult MyAction(Session session)
{
if (DialogResult.Yes == MessageBox.Show("Do you want to install desktop shortcut", "Installation", MessageBoxButtons.YesNo))
session["INSTALLDESKTOPSHORTCUT"] = "yes";
return ActionResult.Success;
}
}
对于C#skillset来说,另一种方法是在msi安装程序的前端安装一个C#程序,该程序执行以下操作:
- 查看目标系统用户设置,确定哪些功能适合安装在该系统上
- 汇编并格式化msiexec命令行和选定功能的功能参数
- 执行MSIExec命令行
public class CustomActions
{
[CustomAction]
public static ActionResult MyAction(Session session)
{
if (DialogResult.Yes == MessageBox.Show("Do you want to install desktop shortcut", "Installation", MessageBoxButtons.YesNo))
session["INSTALLDESKTOPSHORTCUT"] = "yes";
return ActionResult.Success;
}
}
// ...
internal class Script
static string myWIX_SET_DIRECTORY_STATEMENT = " <SetDirectory Id=\"INSTALLDIR\" Value=\"D:\\Program Files\\DOL\\WA.DOL.HQSYS.ExecECL\" />";
static string myWIX_INSERT_AFTER_TEXT = " <InstallExecuteSequence >";
public static void Main()
{
// ... (your other Wix# code goes here...)
// Hook an event to Wix# save of .wxs file to post-process the .wxs
Compiler.WixSourceSaved += PostProcessWxsXMLOutput;
// Trigger the MSI file build
Compiler.BuildMsi(project);
}
/// <summary>
/// Post-process the Wix .wxs file before compiling it into an MSI
/// </summary>
/// <param name="wxsFileName"></param>
private static void PostProcessWxsXMLOutput(string wxsFileName)
{
StreamReader sr = new StreamReader(wxsFileName);
string myWixDocument = sr.ReadToEnd();
sr.Close();
string myProcessedWixDocument = WiXHelpers.InsertFragmentInWiXDocument(myWixDocument, myWIX_INSERT_AFTER_TEXT, myWIX_SET_DIRECTORY_STATEMENT);
StreamWriter sw = new StreamWriter(wxsFileName);
sw.Write(myProcessedWixDocument);
sw.Close();
}
Compiler.BuildWxs(Project)