代码之家  ›  专栏  ›  技术社区  ›  BlueMonkMN

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

  •  14
  • BlueMonkMN  · 技术社区  · 17 年前

    我正在编写一个游戏开发IDE,用于创建和编译.NET项目(我在过去几年中一直致力于此),并正在对其进行更新,以便不仅为Windows/Visual Studio生成输出,而且为Linux/MonoDevelop生成输出(对于.NET来说,这是一个非常简单的过程,但仍需要一些调整)。

    作为这项工作的一部分,我发现有必要开始生成一个app.config文件,作为这项工作的一部分,以便使用<将依赖DLL名称映射到Linux依赖名称;dllmap>元素。我对谁负责将app.config文件复制到输出名app.exe.config感到困惑。在Visual Studio项目中,app.config的生成操作通常设置为“None”,其设置表明它不会被复制到任何地方,但当Visual Studio编译项目时,它会生成app.exe.config(尽管我有时发现这不可靠)。当我使用MSBuild生成由IDE生成的解决方案文件(用于调试目的)时,MSBuild会将app.config复制到app.exe.config。但是,当我使用CSharpCodeProvider.CompileAsemblyFromFile编译项目时,它(自然)不喜欢将配置文件作为源代码包含(“app.config(1,1):错误CS0116:名称空间不直接包含字段或方法等成员”),当然,当我不将其作为输入包含时,它不会将其复制到输出。我的责任是独立地将app.config复制到app.exe.config,还是有更标准的方法?

    是否硬连线以获取第一个*.config文件?在我的IDE中,可以想象app.config文件将被重命名或添加另一个文件(就像在Visual Studio中一样)。对我来说,IDE对配置文件有这样一个秘密操作似乎有些奇怪(我认为MonoDevelop在这方面的行为类似,因为我在那里也找不到配置文件的特殊操作)。我不知道它是如何选择这个秘密行动适用于哪些文件的。

    5 回复  |  直到 17 年前
        1
  •  8
  •   Mehrdad Afshari    17 年前

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

        2
  •  8
  •   radical    16 年前

    订单:

    1. 项目目录中第一个包含内容生成操作的app.config文件
    2. 子目录中第一个没有生成操作的app.config文件
    3. 子目录中具有内容生成操作的第一个app.config文件

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

        3
  •  5
  •   sashoalm Yaser Kalali    9 年前

    Microsoft.CSharp.targets 通过csproj文件中的此密钥:

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    

    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>
    

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

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

    https://stackoverflow.com/a/40293508/492336 .

    • 选择主项目中设置的值$(AppConfig)。
    • 在与项目相同的文件夹中选择@(无)App.Config。
    • 在与项目相同的文件夹中选择@(Content)App.Config。
    • 在项目的任何子文件夹中选择@(无)App.Config。
        4
  •  1
  •   XOR    17 年前

    我认为MSBuild负责复制。如果您要挖掘stock.target文件,那么您可能会找到相应的指令。VS本身不会复制。

        5
  •  1
  •   Rob    17 年前