Windows Installer不按正确的顺序运行自定义操作代码,但失败

时间:2015-07-23 10:45:25

标签: windows-installer installshield windows-server-2012 custom-action msiexec

我有一种非常奇怪的情况,即自定义操作代码不会同步运行 因为你在日志中可以看到" WinRoot目录"日志行应出现在" CommonFiles Dir"线。然而它最终出现了。

这是代码:

[CustomAction]
    public static ActionResult CCCA_LogProductName(Session session)
    {
        productName = session[InstallShieldConstants.productName];
        CustomActionData customActionData = new CustomActionData();

        // log properties
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "INSTALLDIR : " +
                                session[InstallShieldConstants.installDir]);
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Product Version : " +
                               session[InstallShieldConstants.productVersion]);
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Source Dir : " +
                               session[InstallShieldConstants.sourceDir]);
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "Support Dir : " +
                               session[InstallShieldConstants.supportDir]);
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "CommonFiles Dir : " +
                               Environment.GetEnvironmentVariable("CommonProgramFiles"));
        CCULog.LogMessageToFile(session, "CCCA_LogProductName", "WinRoot Dir : " +
                               session[InstallShieldConstants.windowsVolumeDir]);

        customActionData.Add(InstallShieldConstants.productName, productName);
        session["CCCA_LogProductNameOnFirstTimeInstallStart"] = customActionData.ToString();
        session["CCCA_LogProductNameOnUninstallStart"] = customActionData.ToString();
        session["CCCA_LogProductNameOnUninstallEnd"] = customActionData.ToString();
        session["CCCA_LogProductNameOnInstallStart"] = customActionData.ToString();
        session["CCCA_LogProductNameOnInstallEnd"] = customActionData.ToString();

        return ActionResult.Success;
    }

虽然日志表明以下内容:

  

调用自定义操作   CosmoPublisherCustomActions!CosmoPublisherCustomActions.CCUCustomActions.CCCA_LogProductName   07/23/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName ::   INSTALLDIR:C:\ Program Files(x86)\ CosmoCom \ Server Components \   07/23/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName :: Product   版本:7.2.0.119 07/23/2015 11:24:44 :: CosmoPublisher ::   CCCA_LogProductName :: Source目录:C:\ Program Files   (x86)\ CosmoCom \ Server Components \ CosmoPublisherHotfixes \ HF72-40106 \   07/23/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName ::支持   迪尔:   C:\ Users \用户SVCCOS〜1 \应用程序数据\本地\温度{D3407C75-8846-4DB4-8736-149A884053EF}   07/23/2015 11:24:44 :: CosmoPublisher :: CCCA_LogProductName ::   CommonFiles目录:C:\ Program Files(x86)\ Common Files MSI(s)(C4!70)   [11:24:44:641]:物业变化:添加   CCCA_LogProductNameOnFirstTimeInstallStart属性。它的价值在于   ' ProductName = Media Services .NET'。 MSI(s)(C4!70)[11:24:44:642]:   PROPERTY CHANGE:添加CCCA_LogProductNameOnUninstallStart属性。   它的价值是' ProductName = Media Services .NET'。 MSI(s)(C4!70)   [11:24:44:642]:物业变化:添加   CCCA_LogProductNameOnUninstallEnd属性。它的价值在于   ' ProductName = Media Services .NET'。 MSI(s)(C4!70)[11:24:44:642]:   PROPERTY CHANGE:添加CCCA_LogProductNameOnInstallStart属性。   它的价值是' ProductName = Media Services .NET'。 MSI(s)(C4!70)   [11:24:44:642]:物业变化:添加   CCCA_LogProductNameOnInstallEnd属性。它的价值在于   ' ProductName = Media Services .NET'。 07/23/2015 11:24:44 ::   CosmoPublisher :: CCCA_LogProductName :: WinRoot目录:C:\ CustomAction   CCCA_LogProductName返回实际的错误代码1603(注意这可能不是   如果翻译发生在沙箱内,则100%准确)行动结束   11:24:44:CCCA_LogProductName。返回值3.行动结束11:24:44:   安装。返回值3。

我的Installshield自定义操作设置为' Synchronous'所以我无法理解为什么会这样。奇怪的是,只记录到文件的自定义操作失败了 谢谢

修改
我的日志功能写​​入会话日志和本地文件:

/// <summary>
    /// Writing message to log file
    /// </summary>
    /// <param name="tag">tag of the log message.</param>
    /// <param name="message">message to write to log.</param>
    public static void LogMessageToFile(Session session, string tag, string message)
    {
        StreamWriter sw = File.AppendText(
            GetTempPath() + logFileName);
        try
        {
            string logLine = string.Format(
                "{0:G} :: {1} :: {2}", DateTime.Now, tag, message);
            sw.WriteLine(logLine);
            session.Log("{0:G} :: {1}:: {2} :: {3}", DateTime.Now, logTag, tag, message);
        }
        finally
        {
            sw.Close();
        }
    }  

1 个答案:

答案 0 :(得分:0)

我很好奇为什么我们没有看到DTF的堆栈跟踪。 DTF允许您附加调试器,我确信命令以正确的顺序运行。我从来没有见过MSI登录失序,但它是可能的。你可以尝试/ l * v! (强调!)看看它是否会影响它的表现。

最简单的CA可能会失败。这就是为什么成为他们的主人或者根本不做他们的重要性。