我们使用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=""[#OurLib.dll]"" 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....
- 很明显。
我怎样才能找回相同的&#34; old&#34;输出,我们需要。
尝试使用-scom和-sreg,他们都没有回复过#34; old&#34;输出
答案 0 :(得分:1)
主键重复意味着您在wix源代码中的两个不同位置以某种方式获得了相同的RegistryValue。
或许新版DLL的自注册方式不同?它将InProcServer32值放在引号中。我不认为这是正常的。
或者您是否检查过您的2008和2015 DLL源代码和项目文件是否相同? VS项目升级过程改变了一些事情......