无法获取WindowsInstaller功能的ValidStates

时间:2016-04-11 15:10:02

标签: c# windows-installer

当我尝试使用Microsoft.Deployment.WindowsInstaller.Installer类检索MSI包中所有功能的有效状态时,我遇到了问题。

我想复制Session中每个FeatureInfo的ValidStates属性。然而,当这样做时,我得到一个" Handle处于无效状态。"例外。 如果我使用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;

1 个答案:

答案 0 :(得分:0)

基本问题似乎是您将MSI作为文件打开。既然你没有发布它的声明,或者它是如何设置的,我假设mpath意味着它是文件的路径。您的OpenPackage方法参数似乎也表明了这一点。您收到该错误是因为您尝试在实际安装期间将MSI文件作为文件打开,并且失败。

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

您无法在安装过程中将正在运行的MSI作为文件打开,原因可能是您无法运行使用Orca打开的MSI文件,这是一种简单的文件共享冲突。当您单步使用Visual Studio时,您只需访问静态文件并获取默认值,该文件不会用于安装。另一个问题是每个进程只能有一个Session对象(正如OpenPackage文档所说),并且您正在尝试获取第二个,而已经有一个Session对象与安装句柄相关联。

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

Windows Installer条件表达式(如!feature-state)将告诉您该功能处于什么状态,因为通常最好避免代码,Windows Installer会给您答案。