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

Msbuild 什么';Microsoft.Build.Evaluation的正确用法是什么?,msbuild,Msbuild,我想以编程方式向MSBuild项目添加导入。这个Microsoft.Build.Evaluation名称空间中的API允许我实现这一点(我更希望通过VS扩展性API实现相同的结果,但似乎没有任何方法可以做到这一点,所以我求助于这个API) 如果我想在一个方法中打开一个或多个项目,查看它们的导入,有时还要添加导入,我应该如何使用ProjectCollection对象?我是否总是创建一个新的ProjectCollection,将项目加载到其中,然后在方法末尾卸载所有项目 我有自己想要的工作代码,我猜

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

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


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

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

//
///对Microsoft.Build.Evaluation.Project执行某些操作。
/// 
/// 
/// 
/// 
/// 
静态T WithProject(字符串projectPath,Func worker)
{
var pc=新项目集合();
尝试
{
if(string.IsNullOrWhiteSpace(projectPath))
返回默认值(T);
var evalProject=pc.LoadProject(项目路径);
返回工人(评估项目);
}
抓住
{
返回默认值(T);
}
最后
{
pc.UnloadAllProjects();
}
}
或者更简单(使用ILSpy窥探其他人的DLL):

公共静态项目GetMSBuildProject(字符串项目路径)
{
Project=null;
如果(项目==null)
{
project=新项目(projectPath,new Dictionary(),“12.0”,new ProjectCollection());
}
返回项目;
}

我感觉到了你的痛苦。我希望我能提供比同理心更多的东西。差不多2年后,仍然没有多少信息。到目前为止,这些MsBuild API给我留下了深刻的印象,但只有这些API是我能够正确使用的。谢谢你的解决方案。这比我用的方法好多了!事实上,我确实有一点可以提供。与其说是“newdictionary()”,不如简单地传递“null”。此外,为了进一步证明版本字符串文字“12.0”,静态属性“ProjectCollection.version.ToString(2)”似乎是一个很好的默认值(至少到目前为止)。