当我尝试使用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;
答案 0 :(得分:0)
基本问题似乎是您将MSI作为文件打开。既然你没有发布它的声明,或者它是如何设置的,我假设mpath意味着它是文件的路径。您的OpenPackage方法参数似乎也表明了这一点。您收到该错误是因为您尝试在实际安装期间将MSI文件作为文件打开,并且失败。
获取正在运行的安装的数据库的方法是使用Session.Database。
您无法在安装过程中将正在运行的MSI作为文件打开,原因可能是您无法运行使用Orca打开的MSI文件,这是一种简单的文件共享冲突。当您单步使用Visual Studio时,您只需访问静态文件并获取默认值,该文件不会用于安装。另一个问题是每个进程只能有一个Session对象(正如OpenPackage文档所说),并且您正在尝试获取第二个,而已经有一个Session对象与安装句柄相关联。
作为自定义操作,需要在CostFinalize之后对其进行排序。
Windows Installer条件表达式(如!feature-state)将告诉您该功能处于什么状态,因为通常最好避免代码,Windows Installer会给您答案。