Это поможет, если вы заявили, что язык вы используете ...
Если вы используете управляемый код ... будьте осторожны ограничения (ниже приведенные в документации 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;
}
У меня были хорошие результаты с пользовательскими действиями JavaScript. Намного проще писать, чем C++. Никакой дополнительной зависимости от .NET, как C#. try ... catch делает его достаточно надежным. – Cheeso