谁将app.config复制到app.exe.config?

Blu*_*kMN 14 .net c# monodevelop visual-studio

我正在编写一个游戏开发IDE,用于创建和编译.NET项目(我过去几年一直在研究),并且我正在更新它以生成输出,不仅适用于Windows/Visual Studio,还适用于对于Linux/MonoDevelop(一个非常简单的.NET进程,但仍然需要一些调整).

作为其中的一部分,我发现有必要开始生成app.config文件作为其中的一部分,以将依赖的DLL名称映射到具有<dllmap>元素的Linux依赖项名称.我很担心谁负责将app.config文件复制到输出名称app.exe.config.在Visual Studio项目中,app.config的Build Action通常设置为"None",其设置表明它不会被复制到任何地方,但是当Visual Studio编译项目时它会生成app.exe.config(虽然我有时发现这是不可靠的).当我使用MSBuild构建IDE生成的解决方案文件(用于调试目的)时,MSBuild将app.config复制到app.exe.config.但是当我使用CSharpCodeProvider.CompileAssemblyFromFile编译项目时(自然而然)并没有 像配置文件作为源代码包含("app.config(1,1):错误CS0116:命名空间不直接包含诸如字段或方法之类的成员"),当然它不会将其复制到当我不将它作为输入包括时输出.我是否有责任单独将app.config复制到app.exe.config,或者有更标准的方法吗?

是否硬连线采用第一个*.config文件?在我的IDE中,可以想象app.config文件将被重命名或添加另一个(就像在Visual Studio中一样).我觉得IDE对配置文件有这个秘密行为似乎很奇怪(我认为MonoDevelop在这方面表现相似,因为我找不到配置文件的特殊操作).我不知道它甚至会选择这个秘密行动适用的文件.

Meh*_*ari 8

C#编译器根本不关心配置文件.构建环境(MSBuild和VS)将负责自己复制该文件.


rad*_*cal 7

订购:

  1. 项目目录中的第一个带有无构建操作的app.config文件
  2. 项目目录中包含Content build action的第一个app.config文件
  3. 第一个带有无构建操作的app.config文件,位于子目录中
  4. 第一个带有内容构建操作的app.config文件,位于子目录中

msbuild/xbuild还允许您通过设置$(AppConfig)属性来覆盖它.


sas*_*alm 5

一个稍微技术性的答案 - 您的项目Microsoft.CSharp.targets通过 csproj 文件中的这个键引用:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Run Code Online (Sandbox Code Playgroud)

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets根据您的框架版本,此文件将解析为类似的内容。

在它里面你有这个部分来完成工作:

  <!--
    ============================================================
                                        _CopyAppConfigFile

    Copy the application config file.
    ============================================================
    -->
  <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>
Run Code Online (Sandbox Code Playgroud)

App.Config 文件似乎是作为环境变量传递的(它应该存在但是谁设置的,​​我不知道):

<ItemGroup>
  <AppConfigWithTargetPath Include="$(AppConfig)" Condition="'$(AppConfig)'!=''">
    <TargetPath>$(TargetFileName).config</TargetPath>
  </AppConfigWithTargetPath>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

编辑:有关 app.config 的选择方式,请参阅此答案 - /sf/answers/2820545591/

app.config 的处理比较特殊,它是按名称处理的,构建过程会按照这个顺序选择 app.config 文件:

  • 选择在主项目中设置的值 $(AppConfig)。
  • 在与项目相同的文件夹中选择@(None) App.Config。
  • 在与项目相同的文件夹中选择@(Content) App.Config。
  • 在项目的任何子文件夹中选择 @(None) App.Config。
  • 在项目的任何子文件夹中选择 @(Content) App.Config。