【问题标题】:Wix CustomAction session.Log not workingWix CustomAction session.Log 不工作
【发布时间】:2009-11-05 18:09:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: logging wix windows-installer custom-action


    【解决方案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;
    }
    

    【讨论】:

    • 我在 JavaScript 自定义操作方面取得了不错的成绩。比 C++ 更容易编写。没有像 C# 这样的额外 .NET 依赖项。 try...catch 使它相当健壮。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多