MSI 内にパッケージ化したい関連する Windows レジストリ エントリがいくつかあるため、1) アンインストール プロセスがあり、2) これらのレジストリ エントリが特定のコンピュータに適用されているという事実は、[プログラムの追加と削除] エントリによって文書化されます。 .
問題は、Wix# でこれをうまく実行できることですが、すべてのレジストリ エントリが "Dir" ブロック内にある場合にのみ MSI をビルドすることができ、物理フォルダーを実際に作成することになります。 '望まない、ターゲット システム上。
一時的な回避策として、ダミーの「Temp」フォルダーを指定して、Dir ブロックを使用することにしました。インストーラーは実際にフォルダーを作成しますが、これは望ましくありません。私が望むのは、レジストリ エントリを適用することだけです。
WiX のドキュメントでは、基本的に、ターゲット システムでアクションを実行するようにインストーラーに指示するものとして、その基礎となる構成体である TargetDir について説明しています。http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/write_a_registry_entry.htmlを参照してください。
そのネイティブ WiX XML の例では、ターゲット システム上に不要なフォルダーが作成されないように見えます。必要なレジストリ エントリのみが適用されます。レジストリ エントリを適用し、ターゲット システムに実際のフォルダを作成する必要を回避するために、どの Wix# 構文構造を使用できますか?
これまでに見たすべての Wix# サンプルには、必要かどうかに関係なく、ターゲット システムに実際のフォルダーを作成するという副作用があるようです。
レジストリ エントリの .reg ファイルを取得し、それらを熱で .wxs ファイルに収集し、キャンドルとライトで msi にビルドすることで、おそらくこれを実行できることを私は知っています。私は本当にこれを C#/Wix# の世界に留めようとしています。C# は、私の組織で十分に理解されているスキル セットです。WiXはそうではありません。(Wix# は WiX の機能の上に構築されており、WiX と Windows インストーラーのある程度の理解が不可欠であることを認めます。XML の代わりに C# を使用できることは、完全に論理的なことではなく、コンフォート ゾーンのことです。) 現在、これらのタイプのレジストリ設定タスクの多くは手動で行っており、追跡も簡単で信頼性の高いアンインストールもありません。
/// <summary>
/// Configure the Event Log on a Windows (server) to have MyApplication Log settings and record an entry for it in Programs and Features.
/// Note that this program creates the Windows Installer MSI that accomplishes this.
/// This program creates a WiX XML file that is then compiled by the WiX Toolkit (Candle and Light) into the MSI file.
/// </summary>
internal class Script
{
public static void Main()
{
// Define a new Installer Project object
var project = new Project("SetupMyApplicationEventLog" ,
// Provide dummy "Temp" install directory to satisfy WiX# Syntactical requirement. There are no actual files being installed.
new Dir(@"Temp"),
/*
* Event Log Registration Entries, translated from .reg file
*/
// First, add the root level key of the tree of keys
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log",
"",
"") { AttributesDefinition = "Component:Win64=yes" },
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\STV.DSD.HQSYS.SERVICE2]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\" + "STV.DSD.HQSYS.SERVICE2",
"EventMessageFile",
"C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll") { AttributesDefinition = "Component:Win64=yes" },
//[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\STV.VFS.ONLINE]
//"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll"
new RegValue(
RegistryHive.LocalMachine,
@"SYSTEM\CurrentControlSet\Services\Eventlog\MyApplication Log\" + "STV.VFS.ONLINE",
"EventMessageFile",
"C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\EventLogMessages.dll") { AttributesDefinition = "Component:Win64=yes" } );
// Set the properties of the setup project
// Set UI to minimal; there are no choices to be made here.
project.UI = WUI.WixUI_ProgressOnly;
project.Manufacturer = "STV";
project.OutFileName = "SetupMyApplicationEventLog";
project.GUID = new Guid("037C625A-609C-4C2C-9689-62A075B88AD7");
// Assign version # to setup MSI property of type System.Version
project.Version = new Version(4, 0, 0, 0);
// Add the Win64 attribute to the package, to force a 64-bit MSI to be created
project.Package.AttributesDefinition = "Platform=x64";
// Trigger the MSI file build
Compiler.BuildMsi(project);
//// Also create the .wxs file so we can see what was sent to WiX to build the MSI
Compiler.BuildWxs(project);
Console.WriteLine("productVersion=" + project.Version);
Console.ReadLine();
}
}
}