Как перехватить исключение AccessViolationException в .NET 8 и корректно выйти из приложения?C#

Место общения программистов C#
Ответить
Anonymous
 Как перехватить исключение AccessViolationException в .NET 8 и корректно выйти из приложения?

Сообщение Anonymous »

Часть моего кода выдает исключение AccessViolationException; код не находится под моим контролем; Я не могу решить проблему. Когда выдается это исключение, мое приложение аварийно завершает работу. Я работаю с консольным приложением и приложением WinForms с одним и тем же кодом. Проблема одинакова в обоих вариантах.
Я знаю, что не могу обработать это исключение и не должен; вот почему это приводит к сбою приложения. Я могу проверить журнал в средстве просмотра событий. Я тоже не хочу обрабатывать это исключение; Я просто хочу поймать это, чтобы можно было написать журнал, а затем позволить приложению умереть любым способом. Так что сбой приложения здесь не моя проблема. Мне нужно написать журнал до сбоя, чтобы мне не нужно было заходить в средство просмотра событий, чтобы проверить, что пошло не так.
Я нашел полезными следующие вопросы:
Как обрабатывать AccessViolationException
Надежная обработка исключений поврежденного состояния в .NET Core
Как перехватить AccessViolationException в .net core 2.0
Есть и другие несколько вопросов по переполнению стека, в которых говорится об этой проблеме; но все они относятся к старой .NET Framework.
В более старых версиях .NET Framework в app.config можно было установить параметр: Я попробовал это, и это сработало для меня в .NET Framework 4.
Существует также атрибут [HandleProcessCorruptedStateExceptions], который устарел в .NET 8. Я все еще пробовал его, и он не работает; приложение по-прежнему вылетает; ниже приведен код:

Код: Выделить всё

[HandleProcessCorruptedStateExceptions]
private bool MethodThatThrowsException(string filePath)
{
...
...
}
Другой атрибут [SecurityCritical] также может использоваться в соответствии с ответами на эти вопросы; но для этого требуется полное доверие, что не всегда возможно.
Способ использования переменной среды COMPlus_legacyCorruptedStateExceptionsPolicy, описанный в одном из вопросов, также не работает. Добавление следующего кода при запуске моего приложения по-прежнему приводит к сбою приложения:

Код: Выделить всё

static class Program
{
[STAThread]
static void Main(string[] args)
{
Environment.SetEnvironmentVariable("COMPlus_legacyCorruptedState­­ExceptionsPolicy", "1");

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
Похоже, что эти решения больше не поддерживаются .NET 8:

https://github.com/dotnet/runtime/issue ... -554933927

https://github.com/dotnet/runtime/issue ... -555048590
Таким образом, единственный оставшийся вариант — LegacyCorruptedStateExceptionsPolicy. Я хочу использовать это в своем приложении, ориентированном на .NET 8. Как и где я могу установить этот параметр в .NET 8? В .NET 8 нет файла app.config. Подходит ли .runtimeconfig.json? И все же, как это там настроить?

Подробнее здесь: https://stackoverflow.com/questions/799 ... e-applicat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»