Я столкнулся с той же нехваткой документации, когда создавал свой единственный модуль слияния с использованием Visual Studio 2005. У меня был некоторый опыт работы с проектами MSI Setup, и я просто применил информацию, которую имел для проектов MSI Setup, к MSM.
В Visual Studio 2005 (или 2008) проекты MSI и MSM обрабатываются очень схожим образом. Добавьте файлы в проект (либо явно, либо через ссылку на другой проект, найденный в том же решении), затем щелкните правой кнопкой мыши проект, чтобы:
- Просмотр файловой системы.
- Просмотр настроек реестра.
- Просмотр ассоциаций типов файлов.
- Просмотр пользовательских действий.
Пользовательские действия могут быть реализованы в сборке .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 ();
}
}
}
Я надеюсь, что с этой информацией вы сможете продвинуться вперед.