У меня есть стандартная библиотека .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"
System.Configuration.ConfigurationManager
используется приложением .NET Core, которое работает только в Windows, поскольку оно является частью так называемого пакета совместимости Windows для .NET Core. Как вы обнаружили, ваша библиотека используется приложением .NET Framework, тогда приложение может закончиться таким образом. Удалите любой код, зависящий от Windows, из такой библиотеки .NET Standard, так как вместо этого такой код должен жить в проекте .NET Framework. - person Lex Li   schedule 13.12.2019