使用 DTF 安装 msi 包

Using DTF to install msi package

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

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

非常感谢。

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

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

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

但是您正在使用 returns 在实际安装过程中出错的错误消息功能,其中包括 "file in use" 1603:

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

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

您正在呼叫的 API 从 this list, not this one 获取消息。

API 可以通过 Win32Exception class 访问您正在寻找的消息(我将其设为 link,但我没有积分还不够,尽管我确定您可以找到 class),但由于您无法将 LCID 传递给它,因此您需要更改线程的区域性,使用错误代码创建异常,然后还原您的主题文化。

希望对您有所帮助