Выполняем следующую командную строку с высокой температурой (3.0.5210.0):
heat.exe -srd -suid file OurLib.dll -out bin_OurLib.tmp
OurLib.dll — это DLL-файл VC ++ 2008, это 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’ продублирован в таблице ‘Registry’. Пожалуйста, удалите одну из записей или переименуйте часть первичного ключа, чтобы избежать столкновения.
Проверяя файл wixobj, reg51A1FC16367511AF81E9B18CA009A1C6 связан со строкой
<Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}...."
а также <RegistryValue Root="HKCR" Key="CLSID\{B1AB....
— очевидно.
Кстати, это, очевидно, связано с тем, что сгенерированные выходные файлы wix отличаются.
Почему это происходит, если компиляция dll с использованием более нового компилятора C ++ приведет к тому, что WIX HEAT будет генерировать разные выходные данные при выполнении тех же параметров и т. Д.
И как мне вернуть обратно тот же «старый» вывод, который нам нужен.
Пробовал с -scom и -sreg, ни один из них не возвращал «старый» вывод.
Ну, дублированный первичный ключ означает, что у вас есть то же RegistryValue в двух разных местах в вашем исходном коде wix.
Или, может быть, новая DLL самостоятельно регистрируется? Это помещает значение InProcServer32 в кавычки. Я не думаю, что это нормально.
Или вы проверили, что ваши исходные и проектные файлы DLL 2008 и 2015 годов идентичны? Процесс обновления проекта VS меняет дело …
Других решений пока нет …