Page 1 of 1

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

Posted: Thu Nov 12, 2020 8:57 pm
by hellicopter
.Net Core 3.1

Метод

Code: Select all

        [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<long>();
}

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


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

Code: Select all

        [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)
то эффект не проявляется.

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

Posted: Mon Nov 16, 2020 6:13 am
by Admin
Если директория "path" не существует:

- в режиме
Feature = "ultra"
или
Feature = "virtualization"
вместо DirectoryNotFoundException выбрасывается TargetInvocationException
с InnerException is DirectoryNotFoundException
Присылайте простейший пример (оригинал бинарника +VMP проект).

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

Posted: Mon Nov 16, 2020 9:04 am
by hellicopter
Пример во вложении.

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

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

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

Posted: Mon Nov 16, 2020 4:25 pm
by Admin
Проблема здесь заключается в том, что виртуальная машины VMProtect-а вызывает методы через MethodBase.Invoke и при любом возникновении исключения внутри Invoke нетовый рантайм обертывает исключение в TargetInvocationException. Хорошо, что в NETCore есть замечательный флаг "BindingFlags.DoNotWrapExceptions" и эту проблему можно решить довольно просто, а вот что делать для NETFramework (где такого флага тупо нет) - большой вопрос.

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

Posted: Mon Nov 16, 2020 5:07 pm
by hellicopter
Ну, поскольку можно рассчитывать, что новый софт будет писаться на .NET 5,
то, возможно, проблема не столь страшна.

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

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

Posted: Thu Nov 19, 2020 10:17 am
by Admin
1. Можно ли рассчитывать, что в следующем билде флаг "BindingFlags.DoNotWrapExceptions" будет применяться?
Да.
2. Почему применение async/await убирает данную проблему?
Вопрос к авторам нетового рантайма.

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

Posted: Thu Nov 19, 2020 11:13 am
by Admin
Проверяйте 1254.

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

Posted: Thu Nov 19, 2020 6:41 pm
by hellicopter
В 1254 исправлено.
Спасибо.