Обработка исключений в .Net Core 3.1

.Net Core 3.1

Метод

        [Obfuscation( Feature = "ultra", Exclude = false )]
        public static DeleteDirectory( string path ) {
            try {
                Directory.Delete( path, true );
            }
            // fix {
            catch( TargetInvocationException ex ) when( ex.InnerException is DirectoryNotFoundException ) {
            }
            // } fix
            catch( DirectoryNotFoundException ) {
            }
        }

Если директория “path” не существует:

  • в режиме
    Feature = “ultra”
    или
    Feature = “virtualization”
    вместо DirectoryNotFoundException выбрасывается TargetInvocationException
    с InnerException is DirectoryNotFoundException

  • в режиме
    Feature = “mutation”
    работает корректно, т.е. выбрасывается DirectoryNotFoundException

Проблему обошёл добавлением обработчика
catch( TargetInvocationException ex ) when( ex.InnerException is DirectoryNotFoundException ) {
return new List();
}

Однако, хотелось бы реализовать обработку более корректно.
Или я что-то делаю неверно?


Интересно, что, если реализовать метод так

        [Obfuscation( Feature = "ultra", Exclude = false )]
        public static async Task DeleteDirectory( string path, CancellationToken token ) {
            try {
                Directory.Delete( path, true );
            }
            catch( DirectoryNotFoundException ) {
            }
            await Task.CompletedTask;
        }

(т.е. добавить async/await)
то эффект не проявляется.

Если директория “path” не существует:

  • в режиме
    Feature = “ultra”
    или
    Feature = “virtualization”
    вместо DirectoryNotFoundException выбрасывается TargetInvocationException
    с InnerException is DirectoryNotFoundException

Присылайте простейший пример (оригинал бинарника +VMP проект).

Пример во вложении.

Если запустить без обработки VMProtect, то вывод:
Start test
DirectoryNotFoundException
Finish test

Если запустить после обработки VMProtect (VMProtect2.vmp), то вывод:
Start test
TargetInvocationException
Finish test
VMProtect2.7z (82.4 KB)

Проблема здесь заключается в том, что виртуальная машины VMProtect-а вызывает методы через MethodBase.Invoke и при любом возникновении исключения внутри Invoke нетовый рантайм обертывает исключение в TargetInvocationException. Хорошо, что в NETCore есть замечательный флаг “BindingFlags.DoNotWrapExceptions” и эту проблему можно решить довольно просто, а вот что делать для NETFramework (где такого флага тупо нет) - большой вопрос.

Ну, поскольку можно рассчитывать, что новый софт будет писаться на .NET 5,
то, возможно, проблема не столь страшна.

Вопросы:

  1. Можно ли рассчитывать, что в следующем билде флаг “BindingFlags.DoNotWrapExceptions” будет применяться?
  2. Почему применение async/await убирает данную проблему?
  1. Можно ли рассчитывать, что в следующем билде флаг “BindingFlags.DoNotWrapExceptions” будет применяться?

Да.

  1. Почему применение async/await убирает данную проблему?

Вопрос к авторам нетового рантайма.

Проверяйте 1254.

В 1254 исправлено.
Спасибо.