使用WiX DTF获取组件代码

我一直试图找到一种方法来获得给定产品代码的Windows Installer组件代码。 (我实际上是尝试使用不包含组件代码的快捷方式获取已安装产品的组件路径,但这是一个较长的故事 。)

我遇到过WiX DTF(Microsoft.Deployment.WindowsInstaller)程序集,这看起来像是一个很好的方法来完成MSI的工作。 当我编写以下代码时,我非常有希望:

Session product = Installer.OpenProduct(productCode); ComponentInfoCollection components = product.Components; ComponentInfo component = components.FirstOrDefault(); 

我希望我可以从ComponentInfo获取组件代码。 不幸的是,我认为没办法做到这一点。

是否可以使用WiX DTF类获取组件代码? (或任何其他方式来……)

我不明白为“产品”获得“组件”的愿望,因为它不是1:1的关系。 那说这可以做你所要求的:

 const string PRODUCT_CODE = "{EBBD327E-F220-4567-88F8-CEE3BE560F81}"; var comps = from c in ComponentInstallation.AllComponents where c.Product.ProductCode == PRODUCT_CODE select c; string componentId = comps.FirstOrDefault().ComponentCode; 

我发现可以使用以下代码获取组件代码:

 private string GetComponentIdFromMsi() { using (Session product = Installer.OpenProduct(_productCode)) using (Database database = product.Database) { var featureComponentsRecords = GetFeatureComponents(database); var featureComponentsRecord = featureComponentsRecords.Single(x => x.Feature == _feature); var componentRecords = GetComponents(database); var componentId = componentRecords.Single(x => x.Component == featureComponentsRecord.Component).ComponentId; return componentId; } } private IEnumerable GetFeatureComponents(Database database) { var list = database.ExecuteQuery("SELECT `Feature_`, `Component_` FROM `FeatureComponents`"); const int columnCount = 2; const int featureOffset = 0; const int componentOffset = 1; int rowCount = list.Count / columnCount; for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { var rowOffset = rowIndex * columnCount; yield return new FeatureComponentsRecord((string)list[rowOffset + featureOffset], (string)list[rowOffset + componentOffset]); } } private IEnumerable GetComponents(Database database) { var list = database.ExecuteQuery("SELECT `Component`, `ComponentId` FROM `Component`"); const int columnCount = 2; const int componentOffset = 0; const int componentIdOffset = 1; int rowCount = list.Count / columnCount; for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { var rowOffset = rowIndex * columnCount; yield return new ComponentRecord((string)list[rowOffset + componentOffset], (string)list[rowOffset + componentIdOffset]); } } private class FeatureComponentsRecord { public FeatureComponentsRecord(string feature, string component) { Feature = feature; Component = component; } public string Feature { get; private set; } public string Component { get; private set; } } private class ComponentRecord { public ComponentRecord(string component, string componentId) { Component = component; ComponentId = componentId; } public string Component { get; private set; } public string ComponentId { get; private set; } }