无法获取 WindowsInstaller 功能的 ValidStates

Cannot get ValidStates of WindowsInstaller features

我在尝试使用 Microsoft.Deployment.WindowsInstaller.Installer class.

检索 MSI 包中所有功能的有效状态时遇到了问题

我想复制会话中每个 FeatureInfo 的 ValidStates 属性。但是,这样做时我得到一个 "Handle is in an invalid state." 异常。 如果我使用 Console.WriteLine() 打印出这些值中的每一个,或者单步执行 Visual Studio 中的代码,则没有例外。

我不知道是什么阻止我这样做。 提前致谢!

我的代码:

var featureDictionary = new Dictionary<string, string[]>();

if (string.IsNullOrWhiteSpace(mPath))
    return featureDictionary;

try
{
    Installer.SetInternalUI(InstallUIOptions.Silent);
    using (var session = Installer.OpenPackage(mPath, true))
    {           
        foreach (var feature in session.Features)
        {
            try
            {
                var states = feature.ValidStates.Select((state) => state.ToString());
                featureDictionary.Add(feature.Name, states.ToArray());
            }
            catch (InstallerException ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    }
}
catch (InstallerException) { }

return featureDictionary;

基本问题似乎是您将 MSI 作为文件打开。由于您尚未发布其声明或设置方式,因此我假设 mpath 表示它是文件的路径。您的 OpenPackage 方法参数似乎也表明了这一点。您收到该错误是因为您在实际安装期间尝试将 MSI 文件作为文件打开,但失败了。

为 运行ning 安装获取数据库的方法是使用 Session.Database。

您无法在安装期间将 运行ning MSI 作为文件打开,原因可能与您无法 运行 使用 Orca 打开的 MSI 文件相同,一个简单的文件共享违规。当您单步执行 Visual Studio 时,您只是访问静态文件并获取默认值,并且该文件未用于安装。另一个问题是每个进程只能有一个 Session 对象(如 OpenPackage 文档所说),并且您试图获得第二个,而已经有一个与安装句柄相关联的 Session 对象。

作为自定义操作,它需要在 CostFinalize 之后进行排序。

Windows 安装程序条件表达式,例如 !feature-state 会告诉您功能处于什么状态,因为通常最好避免使用 Windows 安装程序只会给您答案的代码。