Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹

Posted

技术标签:

【中文标题】Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹【英文标题】:Visual Studio/MSBuild copy referenced class library's app.config as *.dll.config to bin folder of current project 【发布时间】:2016-04-21 01:34:11 【问题描述】:

我有一个被许多其他 Web 应用程序项目引用的类库。它在其app.config 中有许多设置,我希望在所有引用 Web 项目中使用这些设置。构建类库时,它会将app.config 复制到自己的bin 文件夹中作为<assembly.name>.dll.config

如何确保将<assembly.name>.dll.config 复制到我的每个 引用Web 应用程序项目的bin 文件夹中?

Visual Studio / MSBuild 默认似乎不这样做。 更改 Copy to Output DirectoryBuild Action(任意组合)不起作用。 SlowCheetah VS 扩展似乎可以做我想做的事情,这是其配置转换过程的意外副作用,但我想这样做 没有任何第 3 方扩展.

顺便说一句:手动将所有这些配置放入每个 Web 应用程序项目中是不切实际的。我可以通过在 bin 文件夹中查找 <assembly.name>.dll.config 来读取文件,然后从那里提取设置。我已经可以做到这一点,所以这不是问题 - 我只需要确保文件可以在那里阅读

【问题讨论】:

【参考方案1】:

这可以通过将以下内容添加到类库的项目文件assembly.name.csproj 来实现,而无需第三方工具:

// Find this <Import> element for Microsoft.CSharp.targets
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
// Add this <ItemGroup> element immediately after
<ItemGroup>
    <Content Include="app.config">
        <Link>$(TargetName).dll.config</Link>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
</ItemGroup>

这会导致将app.config 复制到引用它为&lt;assembly.name&gt;.dll.config 的任何项目。这很好,因为您只需要配置一个.csproj 文件,效果就会级联到所有引用项目。

【讨论】:

我试图让它与网站项目一起工作,但它不会复制 *.dll.config 文件。 太棒了!我有参考 ConsoleApp 的 WinFormsApp,我需要将 ConsoleApp.exe.config 文件复制到 WinFormsApp 输出文件夹。我稍微修改了&lt;Link&gt;$(TargetName).exe.config&lt;/Link&gt;上面的代码。 (dll改为exe) @cincua 我不确定网站项目,抱歉。它似乎适用于 Web 应用程序项目或 WinFormsApp。也许您可以尝试创建一个 Web 应用程序项目来检查您没有做错什么并确认是 Web 站点项目是罪魁祸首? 这很好用!附注:虽然这已经可以通过替换 app.config 的现有元素来实现,但配置文件在解决方案资源管理器中将不再可见。所以我留下了原来的元素,只添加了另一个带有LinkCopyToOutputDirectory 子元素的元素。 我最终得到了 Link 元素的以下内容,它同样适用于 exedll 程序集:&lt;Link&gt;$(TargetFileName).config&lt;/Link&gt;【参考方案2】:

Visual Studio 2015 及更早版本

对于 Visual Studio 2015,我正在使用@theyetiman 的解决方案(请参阅此answer):

<ItemGroup>
  <None Include="app.config" />
</ItemGroup>
<ItemGroup>
  <None Include="app.config">
    <Link>$(TargetFileName).config</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Microsoft.CSharp.targets 的导入已经存在。)

Visual Studio 2017

在我的实验中,Visual Studio 2017 似乎可以按预期开箱即用地处理配置文件。无需手动修改项目文件。

【讨论】:

Visual Studio 2019 似乎无法开箱即用。

以上是关于Visual Studio/MSBuild 将引用的类库的 app.config 作为 *.dll.config 复制到当前项目的 bin 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 未将对象引用设置到对象的实例

Visual Studio 2019 未将引用的项目添加到 deps.json

在 Visual Studio 2013 中,如何将代码分析限制为我的代码而不是引用的程序集?

WP7,将服务引用添加到Visual Studio 2010后如何使用它

如何在 Visual Studio 2010 中正确引用 dll?

10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)