如何确保在 C# 项目中更改配置文件会导致 DLL 被重建?

EM0*_*EM0 4 c# msbuild build visual-studio-2015

我在 Visual Studio 2015 中有一个 C# DLL 项目 (A),其中包含一个我想复制到输出的自定义配置文件,因此“复制到输出目录”设置为“如果更新则复制”。此 DLL 被同一解决方案中的另一个项目 (B) 引用。每当我重建项目 B 时,项目 A 中的配置文件都会按照我的意愿复制到其输出目录中。

问题是,如果我修改配置文件,它不会被复制到输出中。我认为这是因为项目 A 的输出没有改变,所以 MSBuild 不会费心将其复制到项目 B 的输出目录。

我发现的一种解决方法是将配置文件的内容类型设置为“嵌入式资源”,这会在配置文件更改时重新构建项目 A。这有效,但它有点黑客。有没有更好的方法来获得相同的行为而不实际在 DLL 中包含配置文件?

EM0*_*EM0 5

好吧,我想我已经想出了一个办法。CustomAdditionalCompileInputs定义了一个项目组Microsoft.CSharp.Core.targetsCoreCompile目标取决于此。所以我简单地添加了以下目标,使 CoreCompile 依赖于所有具有构建操作的文件NoneContent

  <Target Name="EnsureRecompiledOnConfigFileChanges" BeforeTargets="BeforeBuild">
    <!-- Recompile the project if any items of type "None" or "Content" change in case some of them are config files for a DLL. -->
    <ItemGroup>
      <CustomAdditionalCompileInputs Include="@(None)" />
      <CustomAdditionalCompileInputs Include="@(Content)" />
    </ItemGroup>
  </Target>
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在使用新的项目系统(如果您正在使用 SDK 样式的项目,那么您正在使用新的项目系统),那么您应该将自定义输入添加到“UpToDateCheckInput”组,而不是“CustomAdditionalCompileInputs”。 (3认同)