2013-03-08 5 views
2

Следуя моему последнему вопросу Why does my WiX Custom action throw a System.IO.FileNotFoundException?, теперь я пытаюсь установить дистрибутив C++ как часть моего msi.WiX install C++ распространяемый в msi

Я следовал примеру в соответствии с документацией; http://wix.sourceforge.net/manual-wix3/install_vcredist.htm

<DirectoryRef Id="TARGETDIR"> 
     <Merge Id="VC_Redist" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_CRT_x86.msm" DiskId="1" Language="0"/> 
    </DirectoryRef> 

    <Feature Id="Complete" Level="1" Title="$(var.NVRProduct) $(var.NVRVersion)" Description="Everything" Display="expand"> 
     <Feature Id="VC_Redist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1"> 
     <MergeRef Id="VC_Redist"/> 
     </Feature>  
    </Feature> 

Не работает. Распределяемый C++ не установлен, и впоследствии мой msi выдает ошибку, поскольку отсутствует дистрибутив C++, и удаляет себя.

Это похоже на этот вопрос, на который не ответил. C++ Redistributable package with WIX

Любые идеи оценили.

ответ

2

Я собираюсь ответить на свой вопрос, так как есть ряд вопросов, которые я выяснил после дальнейшего расследования.

Во-первых, установка объединенного модуля VC++ действительно работала!

Я не думал, что это было потому, что я все еще получал ошибку, и я не мог видеть запись для среды исполнения VC++ в программах Add Remove, как вы можете, если вы установите ее вручную.

Однако, изменив установку, чтобы устанавливать дистрибутивы и приложение только там, где я получил ошибку, я мог видеть, что фактически установлена ​​dll VC++. Ошибка, которую я наблюдал, была связана с тем, что программа также требовала повторного использования ATL. (Как я обнаружил, используя Dependency Walker). Ошибка вызвала сбой msi, и dll VC++ была удалена вместе с остальными моими DLL-приложениями!

Как только я предоставил VC++ и дистрибутивы ATL, используя механизм в соответствии с примером в файле справки, все было хорошо.

Я также использовал статически связанную SQLite dll, так как даже с установленными дистрибутивами начальные вызовы SQLite из пользовательского действия не выполнялись. Я думаю, что это должно быть связано с проблемой последовательности установки. Тем не менее, использование статически связанной версии вызвало определенную дискуссию среди разработчиков здесь, вокруг 50-50 раскол в пользу и сильно против использования.

Установка теперь работает, однако.

1

Похоже, что ваше пользовательское действие запланировано перед действием InstallFiles или не отложено, или и то, и другое. Вы не предоставляете определение пользовательских действий, но убедитесь, что ваш элемент CustomAction имеет атрибут Execute, установленный на 'deferred', и убедитесь, что ваш элемент Custom находится в InstallExecuteSequence, запланированном After='InstallFiles'.

В качестве альтернативы вы можете подумать о статической привязке ЭЛТ к своему пользовательскому действию. Я всегда рекомендую этот вариант, так как он делает самостоятельное действие самостоятельно, что значительно увеличивает вероятность того, что пользовательские действия будут всегда работать (в том числе во время установки, ремонта, удаления и исправления).

Смежные вопросы