14

我的解决方案中有一个项目,它最初是一个 C# 库项目。就代码而言,它对它没有任何兴趣,它只是在我的解决方案中用作其他项目的依赖项,以确保首先构建它。构建此项目的副作用之一是创建了一个共享的 AssemblyInfo.cs,其中包含其他项目正在使用的版本号。

我通过将以下内容添加到 .csproj 文件来完成此操作:

<ItemGroup>
  <None Include="Properties\AssemblyInfo.Shared.cs.in" />
  <Compile Include="Properties\AssemblyInfo.Shared.cs" />
  <None Include="VersionInfo.targets" />
</ItemGroup>
<Import Project="$(ProjectDir)VersionInfo.targets" />
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" />

引用的文件 VersionInfo.targets 包含以下内容:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--
      Some properties defining tool locations and the name of the
      AssemblyInfo.Shared.cs.in file etc.
    -->
  </PropertyGroup>
  <Target Name="UpdateSharedAssemblyInfo">
    <!--
      Uses the Exec task to run one of the tools to generate
      AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in
      and some of the other properties.
    -->
  </Target>
</Project>

VersionInfo.targets 文件的内容可以简单地嵌入到 .csproj 文件中,但它是外部的,因为我试图将所有这些都转换为项目模板。我希望模板的用户能够将新项目添加到解决方案中,编辑 VersionInfo.targets 文件并运行构建。

问题是修改和保存 VersionInfo.targets 文件并重建解决方案没有任何效果 - 项目文件使用 .targets 文件中的值,就像打开项目时一样。即使卸载和重新加载项目也没有效果。为了获得新值,我需要关闭 Visual Studio 并重新打开它(或重新加载解决方案)。

如何进行设置,以便配置在 .csproj 文件外部并且不在构建之间缓存?

4

4 回答 4

5

我刚刚回答了一个类似的问题。

如何在 Visual Studio 中关闭构建定义的缓存

希望它也与您的问题有关。

于 2011-06-02T17:19:12.487 回答
3

据我所知,你不能。Visual Studio 没有使用“真正的”MSBuild,它使用的内部构建引擎的行为与 MSBuild.exe 非常相似,但仍有一些细微差别。这个构建引擎缓存了目标,所以一旦你改变了一些东西,你就必须重新启动 VS。我相信,它甚至被记录在某个地方,并且没有已知的解决方法(我大约一年前搜索过它,但一无所获)。

您可能会强制 VS 通过 VS API 重新加载目标 - 因此,您必须创建(或查找)一个自定义插件来执行此操作。

另一种选择是使用 .targets 文件以外的东西来存储您的配置。例如,您可以使用纯文本文件并使用 MSBuild 解析它(不是那么优雅,但它应该可以工作)。

更新。

这就是我前一段时间所做的。MSBuild 通过带有 WorkingDirectory="$(SolutionDir)" 的 Exec 调用外部工具,该工具“了解”有关文件名、位置等的所有约定,因此工作目录足以完成工作。杂项配置数据存储在外部工具的配置中,因此缓存没有问题。

另外,看看这个关于从文件中读取项目的问题。我想,这更适合您的需求。

于 2010-05-25T12:30:02.330 回答
2

我通过修改项目文件(包括自定义 msbuild 文件并使其无效,然后重新加载项目,让它保持卸载,然后修复项目文件并重新加载)取得了一些间歇性的成功。

有时有效,有时无效,但比重新启动 Visual Studio 更好。

于 2010-12-21T07:44:38.813 回答
1

如果您需要一种快速而肮脏的方法来修复它,您可以简单地重新加载解决方案(通过https://stackoverflow.com/a/6877056/182371)。

您可以通过关闭-打开解决方案文件或在外部编辑器中点击保存来完成(然后当您返回 VS 时,它会询问您是否要重新加载)。

于 2012-02-16T14:05:25.230 回答