什么是Microsoft.Build.Evaluation的正确用法?

时间:2014-06-10 11:58:08

标签: msbuild

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

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

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

1 个答案:

答案 0 :(得分:4)

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

    /// <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;
}