在VS2008之后WiX Heat.exe生成不同的输出 - > VS2015升级

时间:2017-07-21 14:44:04

标签: c++ visual-studio-2015 visual-studio-2008 wix heat

我们使用heat(3.0.5210.0)执行以下命令行:

heat.exe -srd -suid file OurLib.dll -out bin_OurLib.tmp

OurLib.dll是一个VC ++ 2008 dll文件,它是一个COM组件。

输出(bin_OurLib.tmp)

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <DirectoryRef Id="TARGETDIR">
                <Component Id="OurLib.dll" Guid="PUT-GUID-HERE">
                    <File Id="OurLib.dll" KeyPath="yes" Source="SourceDir\OurLib.dll">
                        <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}" Context="InprocServer32" Description="OurProduct.OurLib">
                            <ProgId Id="OurProduct.OurLib" Description="OurProduct.OurLib" />
                        </Class>
                    </File>
                </Component>
            </DirectoryRef>
        </Fragment>
    </Wix>

这很好用。 现在我们将VS更新到2015,并用它编译了OurLib。 现在运行相同的加热命令会产生不同的输出:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <DirectoryRef Id="TARGETDIR">
                <Component Id="OurLib.dll" Guid="PUT-GUID-HERE">
                    <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}" Context="InprocServer32" Description="OurProduct.OurLib">
                        <ProgId Id="OurProduct.OurLib" Description="OurProduct.OurLib" />
                    </Class>
                    <File Id="OurLib.dll" KeyPath="yes" Source="SourceDir\OurLib.dll" />
                    <RegistryValue Root="HKCR" Key="CLSID\{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}\InProcServer32" Value="&quot;[#OurLib.dll]&quot;" Type="string" Action="write" />
                </Component>
            </DirectoryRef>
        </Fragment>
    </Wix>

当wix链接时,它会出错:

错误LGHT0130:主键&#39; reg51A1FC16367511AF81E9B18CA009A1C6&#39;在表&#39;注册表&#39;中重复。请删除其中一个条目或重命名主键的一部分以避免冲突。

检查wixobj文件,reg51A1FC16367511AF81E9B18CA009A1C6与线路有关 <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}...."<RegistryValue Root="HKCR" Key="CLSID\{B1AB.... - 很明显。

Anwyay,这显然是由于生成的wix输出文件不同。 为什么使用较新的C ++编译器编译dll会导致WIX HEAT生成不同的输出,同时运行相同的选项等。

我怎样才能找回相同的&#34; old&#34;输出,我们需要。

尝试使用-scom和-sreg,他们都没有回复过#34; old&#34;输出

1 个答案:

答案 0 :(得分:1)

主键重复意味着您在wix源代码中的两个不同位置以某种方式获得了相同的RegistryValue。

或许新版DLL的自注册方式不同?它将InProcServer32值放在引号中。我不认为这是正常的。

或者您是否检查过您的2008和2015 DLL源代码和项目文件是否相同? VS项目升级过程改变了一些事情......