7

在 Visual Studio 中将应用程序配置文件添加到 .Net 项目时,它将被命名并重app.config命名(在构建时)为ApplicationName.config.

我有一个包含大约 40 个项目的解决方案。我想为其中不少添加 log4net 功能。因此,对于每个项目,我都会添加一个文件app.log4net。然后我会像这样声明一个构建后事件:

copy $(ProjectDir)app.log4net $(TargetPath).log4net

这工作得很好。但是我想知道是否有一种内置的方法可以在没有明确的构建后事件的情况下实现相同的目标。

编辑:虽然我喜欢 JaredPar 和 Simon Mourier 提出的两种解决方案,但它们并没有提供我所希望的。拥有一个自定义工具或 MsBuild 规则使其不那么透明(对于项目中的其他程序员)或者至少比使用我当前使用的构建后事件更复杂。尽管如此,我觉得 MsBuild 将是 解决类似问题的正确场所。

4

2 回答 2

6

在这种情况下,更新 app.config 名称的不是 Visual Studio,而是独立于 Visual Studio 的核心 MSBuild 规则。如果你想模拟 app.config 模型,这是你应该采取的方法

在 Microsoft.Common.targets 中可以找到控制 app.config 复制的构建序列的两个部分。

首先计算文件名

<ItemGroup>
    <AppConfigWithTargetPath Include="$(AppConfig)" Condition="'$(AppConfig)'!=''">
        <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
</ItemGroup>

接下来它实际上被复制为构建的一部分

<Target
    Name="_CopyAppConfigFile"
    Condition=" '@(AppConfigWithTargetPath)' != '' "
    Inputs="@(AppConfigWithTargetPath)"
    Outputs="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')">

    <!--
    Copy the application's .config file, if any.
    Not using SkipUnchangedFiles="true" because the application may want to change
    the app.config and not have an incremental build replace it.
    -->
    <Copy
        SourceFiles="@(AppConfigWithTargetPath)"
        DestinationFiles="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')"
        OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
        Retries="$(CopyRetryCount)"
        RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
        UseHardlinksIfPossible="$(CreateHardLinksForAdditionalFilesIfPossible)"
        >

        <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>

    </Copy>

</Target>
于 2011-05-13T16:17:01.227 回答
3

我认为它对于 app.config 是非常硬编码的(你可以尝试其他名称 xxx.config 并且它不起作用)。

您可以在没有构建后事件的情况下获得相同的结果,但使用您将为 .log4net 文件选择的自定义工具。请参阅以下示例:编写自定义工具以生成 Visual Studio .NET 代码开发 Visual Studio 自定义工具

于 2011-05-13T15:52:45.973 回答