Многоплатформенная компиляция: System.Configuration.ConfigurationManager.GetSection выдает ошибку .NetCore - PullRequest
0 голосов
/ 07 июня 2018

Справочная информация: Мы находимся в процессе переноса приложения .Net в .Net Core.В качестве стратегии мы хотели бы сохранить существующую функциональность без изменений в полной среде при переносе части приложения в .Net Core.Полное приложение будет поддерживать .services через Net remoting и REST API, тогда как основное приложение .Net будет поддерживать только службы REST API.Мы решили сохранить одну и ту же кодовую базу для всего приложения и поддерживать компиляцию на нескольких платформах (NetcoreApp2.1 и Net472).Существует один файл конфигурации приложения.Большинство компонентов зависят от информации, хранящейся в этом файле.Таким образом, мы хотели бы сохранить один файл конфигурации для обеих платформ.Я использовал пакет System.Configuration.ConfigurationManager для доступа к информации о конфигурации.

Проблема: ConfigurationManager.GetSection (string) создает исключение на базовой платформе .Net, тогда как на Net472 оно работает нормально.Сообщение об ошибке: Системе конфигурации не удалось инициализироваться ---> System.Configuration.ConfigurationErrorsException: нераспознанный раздел конфигурации system.runtime.remoting

Обход пробовал до сих пор: ConfigurationManager.OpenExeConfiguration (configurationUserLevel).GetSection (string) отлично работает на обеих платформах для извлечения одного и того же раздела

Пример кода:

static MyConfigurationSection myConfigurationSettings { get; set; }
        static void Main(string[] args)
        {
            LoadSettings();
        }

        private static void LoadSettings()
        {
            try
            {
                //Net472 : Works
                //NetCoreApp2.1: Throws exception
                myConfigurationSettings = ConfigurationManager.GetSection("myCustomSettings") as MyConfigurationSection;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            //Works on both platform
            myConfigurationSettings = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).GetSection("myCustomSettings") as MyConfigurationSection;
            Console.WriteLine(myConfigurationSettings.Applications.Count);
            Console.ReadLine();
        }

Вот файл конфигурации

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="myCustomSettings" type="TestConfigManager.MyConfigurationSection, TestConfigManager" />    
</configSections>
<myCustomSettings>
<applications/>
</myCustomSettings>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="1111" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
...