0

我们正在尝试使用 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));
        }

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

提前非常感谢。

4

2 回答 2

2

您正在调用的 API 从这个列表中获取它的消息,而不是这个

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

希望这可以帮助

于 2015-09-06T22:17:49.020 回答
1

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

如果您使用 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 和文化信息作为参数。

于 2015-09-06T18:47:21.453 回答