让我们说我正在创建一个名为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,其内容如下:]]
,但使用的是其他版本v12.0.3。以调试模式构建应用程序。然后,在文件夹[[ConsoleApp2 / ConsoleApp2 / bin / Debug中,创建一个名为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
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>
如果这时您运行该应用程序,它将毫无问题地进行编译,您应该会看到类似的控制台。同样,我如何告诉我的应用程序从我的自定义配置文件中读取请注意,正确地从我的自定义配置文件中读取了(3)设置。到目前为止一切顺利...
现在将默认配置文件重命名为
_ ConsoleApp2.exe.config
,然后再次运行该应用程序。您现在应该得到一个FileLoadException
<runtime>
信息?理论上
在带有.exe和.dll文件的文件夹中,我们尝试保持尽可能少的位置,因此,如果可能,我被要求找到一种摆脱该
ConsoleApp2.exe.config
的方法。现在,由于上述绑定是写在该配置文件中的,所以我只是尝试将这些信息移到我们的自定义配置文件中...但是到目前为止,我仍然未能实现:总是尝试从该ConsoleApp2 .exe.config
,因此,一旦我将其删除,我就会获得例外...让我们说我正在创建一个名为ConsoleApp2的应用程序。由于我正在使用某些第三方库,因此我的默认app.config文件正在生成类似[[.config
文件,您可以保留默认的一个来管理出价重定向,而保留另一个用于您的应用程序参数。为此,Change default app.config at runtime看起来不错。