我们执行与热下面的命令行(3.0.5210.0):维克斯Heat.exe VS2008后,产生不同的输出 - > VS2015升级
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,他们都没有给出“旧”输出。
'1)'是的,_duplicated keys_来自第6行+10(第二个xml)..........'2)'_DLL自注册_可能与新的VC++编译器不同,应该检查,但这看起来不是一件容易的事情........'3)'是的,源代码是一样的,项目文件没有使用,我们从命令行(cl.exe/link.exe) – Zotyi
2)我至少会比较HKCR \ CLSID \ {B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A} \ InProcServer32的值。是一个引用,另一个不是? – tjleigh
我检查了,2008年和2015年编译DLL自注册存储在注册表中相同的键+值。除了一个值的差别:正是你说的关键字:vs2008存储为短路径格式(不含引号),vs2015以长路径格式存储,**用引号**。但是我不认为这可能是生成的.wxs文件有显着差异的原因。但我可能是错的。 – Zotyi