【问题标题】:What's the correct usage of Microsoft.Build.Evaluation?Microsoft.Build.Evaluation 的正确用法是什么?
【发布时间】:2014-06-10 11:58:08
【问题描述】:

我想以编程方式将导入添加到 MSBuild 项目。这个 Microsoft.Build.Evaluation 命名空间中的 API 允许我这样做(我更愿意通过 VS 可扩展性 API 实现相同的结果,但似乎没有任何方法可以做到这一点,所以我求助于这个 API) .

如果我想在一个方法中打开一个或多个项目,查看它们的 Imports,有时添加一个导入,我应该如何使用 ProjectCollection 对象?我是否总是创建一个新的 ProjectCollection,将项目加载到其中,然后在方法结束时将它们全部卸载?

我有可以做我想做的工作的代码,我只是无法猜测如何“正确”使用这个 API,因为只提供了通常的低级参考文档。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    好吧,在没有任何关于如何使用此 API 的建议的情况下,我最终创建了一个新的 ProjectCollection,只要我想使用项目对象,然后在 ProjectCollection 上调用 UnloadAllProjects。

    /// <summary>
    ///  Do something with a Microsoft.Build.Evaluation.Project.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="projectPath"></param>
    /// <param name="worker"></param>
    /// <returns></returns>
    static T WithProject<T>(string projectPath, Func<Project, T> worker)
    {
        var pc = new ProjectCollection();
        try
        {
            if (string.IsNullOrWhiteSpace(projectPath))
                return default(T);
            var evalProject = pc.LoadProject(projectPath);
            return worker(evalProject);
        }
        catch
        {
            return default(T);
        }
        finally
        {
            pc.UnloadAllProjects();
        }
    }
    

    或者,更简单(通过使用 ILSpy 窥探其他人的 DLL):

    public static Project GetMSBuildProject(string projectPath)
    {
        Project project = null;
        if (project == null)
        {
            project = new Project(projectPath, new Dictionary<string, string>(), "12.0", new ProjectCollection());
        }
        return project;
    }
    

    【讨论】:

    • 我感受到了你的痛苦。我希望我能提供的不仅仅是同理心。差不多 2 年后,仍然没有太多信息。到目前为止,这些 MsBuild API 给我留下了深刻的印象,但只有那些我能弄清楚如何正确使用的 API。感谢您的解决方案。比我用的方法好多了!
    • 实际上,我确实有一点可以提供。似乎可以简单地传递“null”,而不是“new Dictionary()”。此外,为了将来证明版本字符串文字“12.0”,静态属性“ProjectCollection.Version.ToString(2)”似乎是一个很好的默认值(至少到目前为止)。
    猜你喜欢
    • 2013-03-09
    • 2011-04-15
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多