如何在MSBuild 14.0中重新加载Microsoft.Build.Evaluation.Project

时间:2016-11-02 04:37:13

标签: c# msbuild

摘要

如果我将.csproj加载到Project实例中,更改磁盘上的.csproj,然后尝试重新加载.csproj(不停止应用程序),我的更改不会显示在新加载的Project实例上好像它被缓存在某处。

详细步骤

我在MSBuild 14.0中使用Microsoft.Build.Evaluation.Project类。

我按如下方式加载项目:

MyProject = new Project(fileName);

fileName是我本地计算机上的.csproj文件。

项目加载到内存后,我通过评估监视窗口中的AllEvaluatedItems来验证它是否包含一个名为Class2.cs的特定文件,该文件显示:

"Compile"="Class2.cs" ["Class2.cs"] #DirectMetadata=0 Microsoft.Build.Evaluation.ProjectItem

然后我在文本编辑器中打开.csproj文件,找到Class2的条目:

<Compile Include="Class2.cs" />

接下来,我从.csproj文件中删除此条目(当最初将其加载到Project实例中的应用程序仍在运行时)并保存.csproj文件。

然后我按如下方式卸载并重新加载项目:

MyProject.ProjectCollection.UnloadProject(MyProject); // call the same code to reload the project from the same .csproj location: MyProject = new Project(fileName);

最后,我在监视窗口中展开新创建的实例的AllEvaluatedItems,我看到Class2再次显示,好像项目没有从磁盘重新加载。

是否存在某种缓存?我是否需要执行其他操作才能从磁盘卸载和重新加载项目?

2 个答案:

答案 0 :(得分:4)

似乎作为项目一部分的ProjectCollection正在执行某种缓存,尽管调用卸载。我按如下方式更改了项目负载:

MyProject = new Project(fileName, null, null, new ProjectCollection());

每次指定一个新的ProjectCollection似乎删除了缓存,并且从磁盘正确加载了项目。

答案 1 :(得分:0)

将更改加载到项目的另一种方法是调用MyProject.ReevaluateIfNecessary()。这样可以节省卸载/娱乐周期。