我们用 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:主键“reg51A1FC16367511AF81E9B18CA009A1C6”在表“注册表”中重复。请删除其中一个条目或重命名主键的一部分以避免冲突。
查看wixobj文件,reg51A1FC16367511AF81E9B18CA009A1C6与行相关
<Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}...."
和 <RegistryValue Root="HKCR" Key="CLSID\{B1AB....
- 显然。
Anwyay,这显然是由于生成的 wix 输出文件不同所致。 为什么如果使用较新的 C++ 编译器编译 dll 会导致 WIX HEAT 生成不同的输出,同时运行相同的选项等。
我怎样才能得到我们需要的相同“旧”输出。
尝试使用 -scom 和 -sreg,它们都没有返回“旧”输出。
最佳答案
好吧,主键重复意味着您在 Wix 源代码的两个不同位置以某种方式获得了相同的 RegistryValue。
或者较新的 DLL 的自注册方式不同?它将 InProcServer32 值放在引号中。我认为这不正常。
或者您检查过您的 2008 和 2015 DLL 源文件和项目文件是否相同? VS 项目升级过程改变了一些事情...
关于c++ - WiX Heat.exe 在 VS2008 -> VS2015 升级后生成不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45240538/