Перехват исключения .Net Standard в фреймворке

У меня есть стандартная библиотека .net, которая создает исключение, определенное в netstandard2.0 (System.Configuration.ConfigurationErrorsException). У меня есть тестовая сборка, скомпилированная для платформы 4.7.2, которая вызывает стандартную библиотеку и хочет перехватить исключение. Все нормально компилируется. Во время выполнения перехват не срабатывает, потому что ConfigurationErrorsException, с которым он связан, относится к версии 4.7.2, а не к стандартной. Обратите внимание на ошибку, которую я получаю от модульного теста.

Как я могу указать своему коду фреймворка поймать стандартное исключение? Примечание. Я также не хочу/не могу сделать тестовую сборку сетевым стандартом.

Сообщение: Тестовый метод RequiredFieldNotSet вызвал исключение System.Configuration.ConfigurationErrorsException, но ожидалось исключение System.Configuration.ConfigurationErrorsException. Сообщение об исключении: System.Configuration.ConfigurationErrorsException: параметр «AnInt» требуется, но не задан!

        try
        {
            SampleSettingsClass target = new SampleSettingsClass(settingsProvider);
        }
        catch (System.Configuration.ConfigurationErrorsException)
        {
            failed = true;
        }

Если вместо этого я использую catch(Exception), исключение перехватывается. Полные типы ожидаемого исключения фреймворка и выброшенного сетевого стандартного исключения различаются.

//framework 
 typeof(System.Configuration.ConfigurationErrorsException).AssemblyQualifiedName
"System.Configuration.ConfigurationErrorsException, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

//net standard 
e.GetType().AssemblyQualifiedName
"System.Configuration.ConfigurationErrorsException, System.Configuration.ConfigurationManager, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"

person Fai    schedule 10.12.2019    source источник
comment
Я запутался, потому что не вижу System.Configuration в список стандартных API .NET. Его нет в списке .NET API. Браузер для .NET Standard 2.0.   -  person Powerlord    schedule 10.12.2019
comment
@Powerlord Возможно, вам нужен этот source.dot.net /#System.Configuration.ConfigurationManager/   -  person Pranav Singh    schedule 10.12.2019
comment
@PranavSingh Это из источника .NET Core, а не .NET Standard.   -  person Powerlord    schedule 10.12.2019
comment
Почему тогда компилируется?   -  person Fai    schedule 10.12.2019
comment
разборка указывает на system.configuration.configurationmanager\4.5.0\ref\netstandard2.0\System.Configuration.ConfigurationManager.dll   -  person Fai    schedule 10.12.2019
comment
Классы System.Configuration не являются частью .NETStandard, вы получили его, добавив пакет Nuget. Таким образом, ваша сборка больше не соответствует требованиям .NETStandard. Да, некрасивая проблема. Вам придется перехватить это исключение до того, как оно просочится в ваш код .NETFramework.   -  person Hans Passant    schedule 10.12.2019
comment
но я добавил чистую стандартную сборку...   -  person Fai    schedule 10.12.2019
comment
разве исключение не должно быть преобразовано в версию фреймворка, чтобы его можно было использовать в фреймворке? Разве это не точка стандарта?   -  person Fai    schedule 10.12.2019
comment
Да, смысл классов .NETStandard в том, что они получают [TypeForwardedTo] эквивалентный класс .NETFramework или .NETCore во время выполнения. Но поскольку классы System.Configuration не охватываются .NETStandard, эти атрибуты отсутствуют. Обычно это не представляет большой проблемы, поскольку вы будете использовать классы пакета Nuget только в своей собственной сборке. Но проблема с исключениями заключается в том, что они могут телепортироваться между сборками. Между прочим, не так уж и плохо ловить Exception, в конечном счете, это не сработавшее исключение, с которым вы можете справиться, только проигнорировав его. Сомнительная тактика.   -  person Hans Passant    schedule 10.12.2019
comment
Таким образом, в пакетах nuget, скомпилированных в соответствии с сетевым стандартом, по-прежнему отсутствуют эти атрибуты, позволяющие пересылать типы? Это не обязательно для всех сетевых стандартных сборок?   -  person Fai    schedule 10.12.2019
comment
Разве эта проблема не намного больше, поскольку она может повлиять на любой тип, превращенный из стандартного обратно в фреймворк? Означает ли это, что все стандартные библиотеки nuget на самом деле нельзя использовать в фреймворке?   -  person Fai    schedule 10.12.2019
comment
Другими словами, предполагается, что System.Configuration.ConfigurationManager используется приложением .NET Core, которое работает только в Windows, поскольку оно является частью так называемого пакета совместимости Windows для .NET Core. Как вы обнаружили, ваша библиотека используется приложением .NET Framework, тогда приложение может закончиться таким образом. Удалите любой код, зависящий от Windows, из такой библиотеки .NET Standard, так как вместо этого такой код должен жить в проекте .NET Framework.   -  person Lex Li    schedule 13.12.2019
comment
@LexLi это комментарий ко мне? У меня нет библиотеки system.configuration.configurationManager, и я не знаю, есть ли в ней код, зависящий от Windows. Это больше похоже на вопрос о том, что значит компилировать по стандарту, и чем это отличается от стандарта.   -  person Fai    schedule 14.12.2019


Ответы (1)


Как говорит Ганс в комментарии, если мое фреймворковое приложение ссылается на стандартную сборку System.Configuration вместо версии фреймворка, то я могу поймать это исключение. Просто волшебная перепечатка, которую я ожидал, не применима к сторонним библиотекам (к сожалению).

person Fai    schedule 13.12.2019