首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WiX DTF获取组件代码

使用WiX DTF获取组件代码
EN

Stack Overflow用户
提问于 2016-01-08 23:10:41
回答 2查看 538关注 0票数 2

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

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

代码语言:javascript
复制
Session product = Installer.OpenProduct(productCode);
ComponentInfoCollection components = product.Components;
ComponentInfo component = components.FirstOrDefault();

我希望我能从ComponentInfo得到组件代码。不幸的是,我没有办法做到这一点。

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

EN

回答 2

Stack Overflow用户

发布于 2016-01-08 23:59:23

我不理解为什么要为“产品”获取“组件”,因为这不是1:1的关系。也就是说,这可以实现您所要求的功能:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2016-01-08 23:38:50

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

代码语言:javascript
复制
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; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34680164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档