c # — поймать собственное исключение в ядре dotnet

в основном приложении dotnet, использующем pinvoke и работающем в linux, например, когда c ++ создает — std::runtime_error — мы получаем:

terminate called recursively
terminate called after throwing an instance of 'terminate called after throwing an instance of 'std::runtime_error*'
Aborted (core dumped)

даже если вызов внешнего метода c ++ заключен в блок try catch в управляемом коде.

как это можно поймать и обработать в управляемом коде ядра dotnet?

0

Решение

Я настроил этот минимальный, полный и проверяемый пример это демонстрирует, как исконные исключения НЕ пойман вообще с помощью управляемого кода C # .NET Core в Linux.

Как описано в проблема, которую я открыл для dotnet/coreclr, Я пробовал (m) любое возможное оружие (и) в арсенале, но безрезультатно.

Прямой ответ, полученный командой dotnet:

Мы не поддерживаем взаимодействие обработки исключений в Unix. Нет хорошего способа сделать это. У проекта Mono есть отличная запись здесь: http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation . То же самое относится и к .NET Core.

Решение проекта Mono, которое также рекомендуется командой dotnet:

Исключения C ++ должны быть отображены в параметр «out» или возвращаемое значение, чтобы управляемый код мог знать, какая ошибка произошла, и (необязательно) генерировать управляемое исключение, чтобы «распространить» исходное исключение C ++.

Это то, что мы реализовали и, ну, это работает :).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector