65.9K
CodeProject 正在变化。 阅读更多。
Home

用于提取 COM DLL 和 EXE 的注册表项的扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (5投票s)

2008年7月14日

公共领域

1分钟阅读

viewsIcon

28805

downloadIcon

535

WIX 中对 COM/DLL 注册表的支持。由于 WIX 不支持构建时的 Extract At 功能,我们可以将此 DLL 作为扩展,在运行 Candle 时使用,并在构建时提取所有注册表项。

引言

WIX 中,构建时提取 COM DLL 和 EXE 的注册表项是不支持的。但是,他们提供了一种编写扩展的方法。可以通过使用 Heat 来提取注册表数据。因此,我使用 Heat.exeWIX 的扩展功能。因此,在使用 Candle 预处理 Wxs 文件时,我们可以生成所有注册表数据。我仍然不确定如何处理 rgs 数据。但这至少解决了安装程序人员一半的问题。希望这能帮助许多正在寻找此类实用程序的安装程序人员。

使用代码

创建一个新的 C# 项目,并将 class1.csAssemblyinfo.cs 复制到各自的位置。现在,添加引用 wix.dllwixUtilExtensions.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 选项获取详细输出,并查看正在为哪些文件生成注册表项以及它们的值。

© . All rights reserved.