[英]Get component code using 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<FeatureComponentsRecord> 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<ComponentRecord> 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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.