2017-02-17 2 views
2

Я обматываю собственный API с помощью вызовов P/Invoke. Для обработки ошибок я использую следующий метод:Исключение в управляемой и неуправляемой цепочке обратного вызова с помощью P/Invoke

  • Возьмите функцию обратного вызова из управляемого кода.
  • Вызвать эту функцию обратного вызова из неуправляемого кода, чтобы указать на ошибку.
  • Выбросить исключение в обратном вызове.

Другими словами, поток, как это:

Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.

Когда я проверить этот метод я могу поймать исключение успешно в первом управляемом методе. Но я не уверен на 100%, что это не вызывает никаких побочных эффектов для стека или утечки памяти.

Можно ли использовать этот метод? Если нет, есть ли другой способ указать ошибку (возможно, включая трассировку стека) без загромождения API с помощью P/Invoke?

P.S. У меня есть доступ к собственному коду.

+0

Какова задача управляемого обратного вызова? Если единственной причиной существования является поднять исключение из-под контроля, вам, вероятно, стоит подумать о создании сборника Interactive C++/CLI, который может, не требуя управляемого обратного вызова. – IInspectable

+0

Да Я знаю о C++/CLI, но проект запускается с использованием подхода P/Invoke, и для преобразования существующей функциональности потребуется некоторое количество работы. –

+0

Вы можете продолжать использовать P/Invoke, где у вас есть, и использовать смешанную сборку смешанного режима для нового кода. Несмотря на это, это не совсем отвечало на вопрос, который я задал. – IInspectable

ответ

1

Короткий ответ: Да, это безопасно.

При определенных условиях:

  • Неуправляемый Функция может обрабатывать исключения SEH (C++ может, но C не может)
  • Неуправляемый Функция будет проходить исключение вызывающей, поэтому его абонент должен иметь возможность понять и обработать управляемое исключение (или передать его сверху).

Пример: вы не можете запустить новый поток и вызвать управляемый обратный вызов в новом потоке, исключение, вызванное обратным вызовом, обязательно прекратит ваше приложение.

+0

По новой теме вы имеете в виду собственный поток, управляемый поток или и то, и другое? –

+0

Кажется, что первое условие должно также включать в себя то, что поддерживает только Visual C++. –

+0

Оба C++ и C могут обрабатывать исключения SEH. Ни один из них не предоставляет стандартные языковые возможности для этого. Если вы не скомпилируете код на C++ и не попросите компилятор пойти нестандартно и разрешите 'catch (...)' обрабатывать исключения SEH (компилятор '/ EHa'). – IInspectable

Смежные вопросы