【问题标题】:How to include the App.config info in a reference executable in .NET?如何在 .NET 的参考可执行文件中包含 App.config 信息?
【发布时间】:2016-02-24 05:13:29
【问题描述】:

我有一个可执行项目,比如说A,它正在运行另一个可执行项目B。为了在 A 的当前工作文件夹中有一个 B.exe,我将 B 添加为 A 的引用,以便在编译后将 B.exe 复制到 A 的文件夹中。但是,我注意到我为B 所做的配置并没有在A 的文件夹中复制或生成(A 的文件夹中没有B.exe.config 文件,只有B.exe),因此诸如此类的东西因为B 的跟踪配置不正确。

我当然可以手动将B.exe.config 复制到A 的文件夹中,但我敢打赌有一些自动的方法可以做到这一点。有人能帮帮我吗?

【问题讨论】:

  • A.exe如何启动B.exe?如果您不在代码中使用它,请不要参考。制作一个后期构建脚本(或其他东西),将其复制到正确的文件夹中。一般来说,每个 appdomain 只有一个 .config 文件,这就是为什么不复制它的原因。 B 的配置在被引用时应该在 A.exe.config 中(这不是一个自动过程)。
  • @the_ajp 感谢您的回复。我确实在代码中启动 B.exe 有两个原因:1)A.exe 是 64 位应用程序,B.exe 是 32 位,因此 A.exe 无法将 B 加载到它的应用程序域中。 2)我希望 B.exe 在 A.exe 存在时被杀死。那么您认为后期构建脚本是最佳做法吗?

标签: .net app-config


【解决方案1】:

您可以使用构建后事件,或者...

在项目 A 中,添加对 B.exe.config 的链接引用。您可以通过将现有项目添加到项目中来完成此操作。但是,在按文件对话框上的“添加”按钮之前,请按“添加”按钮右侧的向下箭头并选择“添加为链接”。然后,将文件设置为复制到输出目录。在您的项目文件中,它将如下所示:

来自 ProjectA.csproj:

<None Include="..\ProjectB\bin\Debug\B.exe.config">
  <Link>B.exe.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

如果您不介意手动编辑项目文件,包含的文件可能取决于构建配置。以下适用于构建(尽管当您双击项目树中的图标时,VS2013 不会打开文件。)

<None Include="..\ProjectB\bin\$(Configuration)\B.exe.config">
  <Link>B.exe.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

【讨论】:

  • 您是否知道为什么这种方法可能不适用于 Team Foundation Build Server
  • @pquest 我没有,但我有另一个数据点给你。我刚刚使用 VS 2015 和 VisualStudio.com 帐户和 TFS 2015 对其进行了测试。它有效。在日志中我可以看到它“将文件从 ProjectB\bin\Release\ProjectB.exe.config 复制到 ProjectA\bin\Release\ProjectB.exe.config”,然后“从 ProjectA\bin\Release\ProjectB.exe 复制.config 到放置文件夹。我确实在指向配置文件的链接中使用了 $(Configuration) 变量。
【解决方案2】:

一个更简单的解决方案是在 csproj 文件中简单地包含以下内容。这包括引用文件的匹配文件扩展名。

  <PropertyGroup>
    <AllowedReferenceRelatedFileExtensions>
      .pdb;
      .xml;
      .exe.config;
      .dll.config
    </AllowedReferenceRelatedFileExtensions>
  </PropertyGroup>

【讨论】:

  • AllowedReferenceRelatedFileExtensions 无法识别
【解决方案3】:

您的应用程序目录中不能有 2 个 app.config。
默认情况下,Visual Studio 将使用启动项目的 app.config。
您可以在复制 app.config 的位置创建构建后事件触发器,但这将替换原始 app.config(我猜它包含您需要的数据)。

最好的方法(除了创建一个干净的dll + 项目架构)是手动将项目A的所有配置数据合并到项目B的配置数据中。

【讨论】:

  • 它不会覆盖 app.config,因为 b.exe 的 app.config 将被称为 b.exe.config 而不是 a.exe.config。你基本上复制了我的评论:(。我没有发布作为答案,因为我们还不知道如何使用 b.exe。
  • 在我提交之前没有刷新页面,但我可以向你保证我没有抄袭。我将其发布为答案,因为我觉得合并 2 个 app.configs 可以解决他的问题。
  • 好吧 :) 呵呵。它将以及何时不会构建后事件。
  • @Kristof 感谢您的回复。另请参阅我对原始帖子的评论。基本上我无法合并 A.exe 和 B.exe,因为它们是一个 64 位应用程序和另一个 32 位应用程序。我可以有 B.exe.config,在这种情况下,我猜 post build event 是唯一的方法?
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2011-10-22
  • 2016-10-31
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多