3

我正在使用 Wix 设置 Windows Installer .msi 文件。我有一个设置 ScheduledTask 的 CustomAction,在 CustomAction 中,我放入了一些 session.Log 语句。

如果我在调试模式下构建所有内容,session.Log 语句似乎可以工作,但是当我在发布模式下构建时,它似乎不再记录。这个对吗?或者是否有其他情况 session.Log 不起作用?有没有办法解决这些情况,所以 session.Log 总是有效的?

编辑:CustomAction 是用 C# 编写的(即托管)

4

2 回答 2

1

如果您说明您使用的语言会有所帮助...

如果您使用的是托管代码...请注意限制(以下引用自 WiX 文档)

在选择使用托管代码而不是传统的本机 C++ 代码编写自定义操作之前,您应该仔细考虑以下事项:

  • 显然,它引入了对 .NET Framework 的依赖。您的 MSI 包可能应该有一个 LaunchCondition 以在发生其他任何事情之前检查是否存在正确版本的 .NET Framework。

  • 如果自定义操作在卸载时运行,那么如果 .NET Framework 不存在,即使您的产品卸载也可能会失败。这意味着如果用户在您的产品之前卸载 .NET Framework,他们可能会遇到问题。

  • 托管自定义操作应配置为针对特定版本的 .NET Framework 运行,并且该版本应与您的实际产品运行的版本相匹配。允许版本“浮动”到最新安装的 .NET Framework 可能会导致与未来版本的兼容性问题。.NET Framework 提供并行功能是有充分理由的——使用它。

此外,您还应该阅读为什么VBScript(和 JScript)MSI CustomActions 很烂

无论如何,忽略所有这些......这是我很久以前在某处找到的用于记录的一些示例 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;
}
于 2009-11-05T21:45:37.583 回答
0

记录的内容由记录选项控制。与安装调试版本相比,安装发布版本时的选项是否相同?

于 2011-05-05T11:21:02.663 回答