首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Build.Evaluation的正确用法是什么?

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

Stack Overflow用户
提问于 2014-06-10 19:58:08
回答 1查看 1.9K关注 0票数 2

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-12-12 00:10:25

好吧,在我找不到任何关于如何使用这个API的建议的情况下,每当我想要使用项目对象时,我都会创建一个新的ProjectCollection,然后在ProjectCollection上调用UnloadAllProjects。

代码语言:javascript
复制
/// <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 ):

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

https://stackoverflow.com/questions/24140413

复制
相关文章

相似问题

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