无法获取 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 安装程序只会给您答案的代码。
我在尝试使用 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 安装程序只会给您答案的代码。