2009-11-05 5 views
3

Я использую Wix для установки MSI-файла установщика Windows. У меня есть CustomAction, который устанавливает ScheduledTask, и в CustomAction я ввел некоторые инструкции session.Log.Wix CustomAction session.Log не работает

Если я создаю все в режиме отладки, операторы session.Log, похоже, работают, но когда я создаю режим Release, он больше не работает. Это верно? Или есть другие сценарии, где session.Log не будет работать? Есть ли способ обойти любой из этих сценариев, так что session.Log всегда работает?

Edit: CustomAction написан на C# (т.е. управляемый)

ответ

1

Это поможет, если вы заявили, что язык вы используете ...

Если вы используете управляемый код ... будьте осторожны ограничения (ниже приведенные в документации WiX)

Прежде чем выбрать, чтобы написать пользовательское действие в управляемом коде вместо традиционного кода родных C++, вы должны тщательно рассмотреть следующие вопросы:

  • Очевидно, что он представляет зависимость от .NET Framework. Вероятно, ваш пакет MSI должен иметь LaunchCondition, чтобы проверить наличие правильной версии .NET Framework, прежде чем что-либо еще произойдет.

  • Если пользовательское действие выполняется при удалении, то даже удаление вашего продукта может завершиться неудачей, если .NET Framework отсутствует. Это означает, что пользователь может столкнуться с проблемой, если они удаляют .NET Framework перед вашим продуктом.

  • Управляемое настраиваемое действие должно быть настроено для работы с определенной версией .NET Framework, и эта версия должна соответствовать версии, с которой работает ваш фактический продукт. Разрешение версии «плавать» на последнюю установленную платформу .NET Framework может привести к проблемам совместимости с будущими версиями. .NET Framework обеспечивает бок о бок функциональность по уважительной причине - используйте ее.

Кроме того, вы также должны прочитать, почему VBScript (and JScript) MSI CustomActions suck

Во всяком случае, не обращая внимания все, что ... вот некоторые примеры C++ код, который я нашел где-то давным-давно, что я использую для регистрации. Возможно, вы сможете найти правильные функции, которые должны быть вызваны на выбранном вами языке.

#define _USE_RTM_VERSION 

void LogString(MSIHANDLE hInstall, TCHAR* szString) 
{ 
    PMSIHANDLE newHandle = ::MsiCreateRecord(2); 
    TCHAR szTemp[MAX_PATH * 2]; 
    sprintf_s(szTemp, MAX_PATH * 2, "-- MSI_LOGGING -- %s", szString); 
    MsiRecordSetString(newHandle, 0, szTemp); 
    MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle); 
} 

UINT __stdcall MyCustomAction (MSIHANDLE hModule) 
{ 
    LogString(hModule, "Whoa! I am a custom action.."); 
    return ERROR_SUCCESS; 
} 
+0

У меня были хорошие результаты с пользовательскими действиями JavaScript. Намного проще писать, чем C++. Никакой дополнительной зависимости от .NET, как C#. try ... catch делает его достаточно надежным. – Cheeso

0

Что регистрируется, зависит от параметров ведения журнала. Являются ли ваши параметры такими же, когда вы устанавливаете версию выпуска по сравнению с тем, когда вы устанавливаете отладочную версию?

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