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

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

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

我有满足我需要的工作代码,我只是猜不到如何“正确地”使用此API,因为仅提供了通常的低级参考文档。

5
投票

好吧,在我找不到如何使用该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;
}