【问题标题】:Using DTF to install msi package使用 DTF 安装 msi 包
【发布时间】:2015-09-06 18:16:04
【问题描述】:

我们正在尝试使用 Microsoft.Deployment.WindowsInstaller dll (C#) 并安装 MSI 包。我找不到很多关于这个的例子。 安装成功。如果出现错误,我想使用 lcid 以特定语言显示错误消息。所以我使用下面的方法传递错误代码。使用的 MSI 语言为英语。

// Sample code for installing
        try
        {
            Installer.InstallProduct(@"Sample.msi", "ALLUSERS=1 ADDLOCAL=ALL");
        }
        catch (InstallCanceledException ex)
        {
            errorList.Add(ex.ErrorCode + " " + ex.Message);

        }
        catch (InstallerException ex)
        {
            errorList.Add("Exit Code: " + ex.ErrorCode + ", " + ex.Message);
            // Translate error message to different language
            // ex.GetErrorRecord is always null,so the below method doesn't work.
            string langError = Installer.GetErrorMessage(ex.GetErrorRecord(),System.Globalization.CultureInfo.GetCultureInfo(1031));
        }

我使用的方法对吗?请提供/指向我可以获得特定语言的正确错误消息的示例。

非常感谢。

【问题讨论】:

    标签: wix windows-installer wix3.5 dtf msi-gui


    【解决方案1】:

    您调用的 API 从this list 获取消息,而不是从this one

    可以通过 Win32Exception 类访问为您提供所需消息的 API(我会将此作为链接,但我还没有足够的积分,尽管我确信您可以找到该类),但由于您无法将 LCID 传递给它,因此您需要更改线程的文化,使用错误代码创建异常,然后恢复线程的文化。

    希望对你有帮助

    【讨论】:

    • 感谢您的澄清,我只能以默认语言检索邮件。有没有更简单的方法来获取特定语言的错误消息?
    • 这个问答 (stackoverflow.com/questions/197127/…) 说设置线程的文化“有时”有效,我真的不知道该怎么做。其他线程说,对 FormatMessage api 进行 pinvoke 不可靠/崩溃。这是可能的,但往往需要非常关注细节。
    【解决方案2】:

    您应该显示更多代码,以便我们可以看到您从哪里得到该错误,因此其中一些可能是您已经在做的事情。

    如果您使用 Installer.InstallProduct,那么如果它失败,您会收到一个 InstallerException,并且它已经包含一条消息以及一个错误代码。基本上,您需要(在所有内容下方)调用 MsiInstallProduct 的结果,这是包括您的 1603 的列表:

    https://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx

    但是您使用的错误消息函数会在实际安装过程中返回错误,其中包括“正在使用的文件”1603:

    https://msdn.microsoft.com/en-us/library/aa372835(v=vs.85).aspx

    您可能已经完成了所有这些,如果是这样,那么您的问题可能是关于如何以适当的语言从 InstallerException 获取错误消息。因此,也许您需要调用 GetErrorMessage 重载,该重载使用 InstallerException 中的 GetErrorRecord 和文化信息作为参数。

    【讨论】:

    • 感谢您的澄清,我添加了代码,根据您的建议,GetErrorMessage 重载不起作用,因为 ex.GetErrorRecord 始终为空。还有其他建议吗?
    猜你喜欢
    • 2011-05-11
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多