1

我目前正在对我公司的企业库进行更改,并且正在考虑创建一个部署项目,该项目将允许开发人员通过 MSI 安装程序或某种类型的设置可执行文件来设置库。

我正在研究使用合并模块项目来完成这项任务。一个基本的谷歌搜索没有产生任何有用的资源来使用合并模块产品。

有谁知道有关创建合并模块项目的有用资源/教程,或者他们对完成此任务有更好的建议吗?

更新

我能够使用对所有需要的程序集的适当引用来构建我的合并模块项目。它生成了一个 .MSM 文件。实际运行和测试它的下一步是什么?

4

2 回答 2

2

MSM本身不能运行或测试。但是,您可以将其嵌入 MSI,然后简单地尝试使用标准工具安装 MSI(即手动右键单击 MSI 并选择InstallUninstall,使用 Visual Studio 或执行相应的msiexec.exe命令) .

要将 MSM 嵌入 MSI,最简单的方法是在 Visual Studio 中创建一个安装项目,然后从您刚刚在解决方案中创建的合并模块项目中添加合并模块。这将自动引用 MSM 文件并将其包含在 MSI 中。

于 2009-03-28T09:45:20.410 回答
1

当我使用 Visual Studio 2005 构建我唯一的合并模块时,我面临同样缺乏文档的问题。我对 MSI 设置项目有一些经验,我只是将我为 MSI 设置项目获得的信息应用到了 MSM。

在 Visual Studio 2005(或 2008)中,MSI 和 MSM 项目的处理方式非常相似。将文件添加到项目中(显式地或通过在同一解决方案中找到的另一个项目的引用),然后使用右键单击项目来:

  1. 查看文件系统。
  2. 查看注册表设置。
  3. 查看文件类型关联。
  4. 查看自定义操作。

自定义操作可以在 .NET 程序集中实现,例如,通过继承Installer类。这是一个示例,例如,在安装或卸载 MSM/MSI 时安装或卸载打印机:

using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;

namespace Epsitec.PostScriptPrinterInstaller
{
    [RunInstaller (true)]
    public partial class PrinterInstaller : Installer
    {
        public PrinterInstaller()
        {
            this.InitializeComponent ();
        }
        public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install (stateSaver);
            string sysroot = System.Environment.GetEnvironmentVariable ("SystemRoot");
            string infpath = @"""" + System.IO.Path.Combine (sysroot, @"inf\ntprint.inf") + @"""";
            ProcessStartInfo info;
            Process process;

            info = new ProcessStartInfo ("rundll32.exe",
                       @"printui.dll,PrintUIEntry /if /b ""PostScript"" /m ""MS Publisher Color Printer"" /f "+infpath+@" /r ""FILE:""");

            process = Process.Start (info);
            process.WaitForExit ();
        }

        public override void Uninstall(System.Collections.IDictionary savedState)
        {
            base.Uninstall (savedState);
            ProcessStartInfo info;
            info = new ProcessStartInfo ("rundll32.exe",
                       @"printui.dll,PrintUIEntry /dl /n ""PostScript""");
            Process process = Process.Start (info);
            process.WaitForExit ();

            info = new ProcessStartInfo ("rundll32.exe",
                       @"printui.dll,PrintUIEntry /dd /m ""MS Publisher Color Printer""");
            process = Process.Start (info);
            process.WaitForExit ();
        }
    }
}

我希望有了这些信息,您将能够取得一些进展。

于 2009-03-25T21:19:32.013 回答