用于提取 COM DLL 和 EXE 的注册表项的扩展
WIX 中对 COM/DLL 注册表的支持。由于 WIX 不支持构建时的 Extract At 功能,我们可以将此 DLL 作为扩展,在运行 Candle 时使用,并在构建时提取所有注册表项。
引言
在 WIX 中,构建时提取 COM DLL 和 EXE 的注册表项是不支持的。但是,他们提供了一种编写扩展的方法。可以通过使用 Heat 来提取注册表数据。因此,我使用 Heat.exe 和 WIX 的扩展功能。因此,在使用 Candle 预处理 Wxs 文件时,我们可以生成所有注册表数据。我仍然不确定如何处理 rgs 数据。但这至少解决了安装程序人员一半的问题。希望这能帮助许多正在寻找此类实用程序的安装程序人员。
使用代码
创建一个新的 C# 项目,并将 class1.cs 和 Assemblyinfo.cs 复制到各自的位置。现在,添加引用 wix.dll 和 wixUtilExtensions.dll。编译项目,你就能得到你想要的 DLL。
在运行 candle.exe 时,传递一个额外的命令行参数:“-ext ComExtension.dll”。对于你想要获取注册表信息的任何文件,请向这些文件添加一个额外的属性“ExtractAtBuid="yes""。此 DLL 将为该文件添加一个注册表项,并从文件中删除该属性,以防止编译失败。
这是从 Heat 中提取的代码片段
public static Wix.RegistryValue[] RegistryHarvest(string filePath)
{
try
{
AssemblyHarvester assemblyHarvester = new AssemblyHarvester();
Wix.RegistryValue[] registryValues =
assemblyHarvester.HarvestRegistryValues(filePath);
return registryValues;
}
catch
{
// try the self-reg harvester
try
{
DllHarvester dllHarvester = new DllHarvester();
Wix.RegistryValue[] registryValues =
dllHarvester.HarvestRegistryValues(filePath);
return registryValues;
}
catch
{
// try the type library harvester
try
{
TypeLibraryHarvester typeLibHarvester = new TypeLibraryHarvester();
Wix.RegistryValue[] registryValues =
typeLibHarvester.HarvestRegistryValues(filePath);
return registryValues;
}
catch
{
return null;
// ignore all exceptions
}
}
}
}
//This checks for the attribute ExtractAtBuild and remove it after making use of it
if (fileElem.HasAttribute("ExtractAtBuild"))
{
GetCompleteFilePath(fileElem);
string fileName = Path.Combine(SourcePath, fileElem.GetAttribute("Name"));
if (!File.Exists(fileName))
{
this.Core.OnMessage(WixErrors.WixFileNotFound(fileName));
continue;
}
RegHarvester.GenerateComRegistryData(SourcePath, DestinationId, document, fileNode);
fileElem.RemoveAttribute("ExtractAtBuild");
}
希望这段代码能有所帮助。
还附带了 DLL。直接使用 DLL 来完成任务。另外,使用 -v 选项获取详细输出,并查看正在为哪些文件生成注册表项以及它们的值。