如何告诉应用程序从我的自定义app.config文件而不是默认值中读取

问题描述 投票:4回答:4

让我们说我正在创建一个名为ConsoleApp2的应用程序。

由于我正在使用某些第三方库,所以我的默认app.config文件正在生成类似代码的代码

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

这是因为我的解决方案引用了一个库的不同版本,所以它需要告诉所有人:“ 嘿,如果您要查找该库的任何oldVersion,只需使用newVersion” 。没关系。

问题是我想定义一个单独的配置文件“ test.exe.config”,在其中我有一些设置并摆脱了自动生成的配置文件。

为了将新的配置文件告诉我的应用,我正在使用类似的代码

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "test.exe.config");

而且(几乎)完美地起作用。我在其中写了“ almost”,因为尽管<appSettings>部分没有被正确读取,但在我的自定义配置文件中并没有查看<runtime>部分,但是App在默认配置文件中查找了它相反,这是一个问题,因为我希望以后可以删除该那个。

所以,我如何告诉我的应用程序也从我的自定义配置文件中读取<runtime>信息?


如何重现问题

重现我的问题的简单示例如下:

使用以下单个类创建名为ClassLibrary2。Net Framework v4.6)的库

using Newtonsoft.Json.Linq;
using System;

namespace ClassLibrary2
{
    public class Class1
    {
        public Class1()
        {
            var json = new JObject();
            json.Add("Succeed?", true);

            Reash = json.ToString();
        }

        public String Reash { get; set; }
    }
}

注意对Newtonsoft包的引用。库中安装的一个是v10.0.2

现在创建一个名为ConsoleApp2。Net Framework v4.6)的控制台应用程序,其类名为Program,其内容如下:]]

using System;
using System.Configuration;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "test.exe.config");

            var AppSettings = ConfigurationManager.AppSettings;

            Console.WriteLine($"{AppSettings.Count} settings found");
            Console.WriteLine($"Calling ClassLibrary2: {Environment.NewLine}{new ClassLibrary2.Class1().Reash}");
            Console.ReadLine();

        }
    }
}

此应用程序也应该已经安装了[[Newtonsoft

,但使用的是其他版本v12.0.3以调试模式构建应用程序。然后,在文件夹[[ConsoleApp2 / ConsoleApp2 / bin / Debug中,创建一个名为

test.exe.config的文件,其内容如下<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <appSettings> <add key="A" value="1"/> <add key="B" value="1"/> <add key="C" value="1"/> </appSettings> </configuration>

并且请注意,在同一
Debug
文件夹中,还存在默认配置文件

ConsoleApp2.exe.config

,其内容类似于<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 如果这时您运行该应用程序,它将毫无问题地进行编译,您应该会看到类似的控制台
enter image description here

请注意,正确地从我的自定义配置文件中读取了(3)设置。到目前为止一切顺利...

现在将默认配置文件重命名为

_ ConsoleApp2.exe.config

,然后再次运行该应用程序。您现在应该得到一个

FileLoadException

enter image description here同样,我如何告诉我的应用程序从我的自定义配置文件中读取<runtime>信息?

理论上


我正在寻找此问题的答案的原因如下:

当我们发布应用程序时,我们将所有.exe和.dll文件放在一个文件夹中,而自定义配置文件(带有设置等)放在另一个文件夹中,客户端的文件与此相似。

在带有.exe和.dll文件的文件夹中,我们尝试保持尽可能少的位置,因此,如果可能,我被要求找到一种摆脱该

ConsoleApp2.exe.config

的方法。现在,由于上述绑定是写在该配置文件中的,所以我只是尝试将这些信息移到我们的自定义配置文件中...但是到目前为止,我仍然未能实现:总是尝试从该

ConsoleApp2 .exe.config

,因此,一旦我将其删除,我就会获得例外...让我们说我正在创建一个名为ConsoleApp2的应用程序。由于我正在使用某些第三方库,因此我的默认app.config文件正在生成类似

[[要正确使用其他.config文件,您可以保留默认的一个来管理出价重定向,而保留另一个用于您的应用程序参数。为此,Change default app.config at runtime看起来不错。

c# .net app-config
4个回答
1
投票
仅保留绑定重定向。

0
投票
鉴于当您尝试使用另一个(非本机)配置文件时,您试图找到一种“适当”替代它的解决方案时,会发生此问题。在我的回答中,我想退后一步,重点介绍您为什么要替代它的原因。根据问题中的描述,您可以定义自定义应用程序设置。如果我理解正确,您打算将其链接到目标项目,将“复制到输出”属性设置为“始终”,然后将其放在应用程序附近。

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.