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

Vic*_*aru 6 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再次出现,好像项目没有从磁盘重新加载.

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

Vic*_*aru 6

尽管调用了unload,但似乎作为项目一部分的ProjectCollection仍在执行某种缓存。我更改了项目负载,如下所示:

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

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

  • 这有助于在以编程方式打开项目时解决以下错误消息:项目集合中已存在等效项目(具有相同全局属性和工具版本的项目),路径为 &lt;path&gt; (3认同)