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

9

概述

如果我将一个 .csproj 文件加载到项目实例中,然后更改磁盘上的 .csproj 文件,并尝试重新加载 .csproj(而不停止应用程序),则新加载的项目实例中不会显示我的更改,就好像它被缓存到某个地方。

详细步骤

我正在使用 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); // 调用相同的代码以从相同的 .csproj 位置重新加载项目: MyProject = new Project(fileName);

最后,我在观察窗口中展开新创建的实例的 AllEvaluatedItems,发现 Class2 再次出现,就好像项目没有从磁盘重新加载。

是否正在进行某种缓存?我需要做些什么才能从磁盘卸载和重新加载项目吗?

2个回答

8
似乎项目中的 ProjectCollection 在调用 unload 后仍在执行某种缓存。我更改了我的项目加载方式如下: MyProject = new Project(fileName, null, null, new ProjectCollection()); 每次指定一个新的 ProjectCollection 似乎可以消除缓存,因此项目可以从磁盘正确加载。

3
在以编程方式打开一个项目时,这可以解决以下错误消息:在项目集合中已经有一个等效的项目(具有相同的全局属性和工具版本),路径为<path>。 - user1529413

2

另一种将更改加载到项目中的方法是调用MyProject.ReevaluateIfNecessary()。这样可以避免卸载/重新创建周期。


1
看起来ReevaluateIfNecessary()不会从磁盘读取更新的文件。它似乎只有在XML被主机在内存中修改时才会这样做。 - Kirill Osenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接