Я обматываю собственный API с помощью вызовов P/Invoke. Для обработки ошибок я использую следующий метод:Исключение в управляемой и неуправляемой цепочке обратного вызова с помощью P/Invoke
- Возьмите функцию обратного вызова из управляемого кода.
- Вызвать эту функцию обратного вызова из неуправляемого кода, чтобы указать на ошибку.
- Выбросить исключение в обратном вызове.
Другими словами, поток, как это:
Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.
Когда я проверить этот метод я могу поймать исключение успешно в первом управляемом методе. Но я не уверен на 100%, что это не вызывает никаких побочных эффектов для стека или утечки памяти.
Можно ли использовать этот метод? Если нет, есть ли другой способ указать ошибку (возможно, включая трассировку стека) без загромождения API с помощью P/Invoke?
P.S. У меня есть доступ к собственному коду.
Какова задача управляемого обратного вызова? Если единственной причиной существования является поднять исключение из-под контроля, вам, вероятно, стоит подумать о создании сборника Interactive C++/CLI, который может, не требуя управляемого обратного вызова. – IInspectable
Да Я знаю о C++/CLI, но проект запускается с использованием подхода P/Invoke, и для преобразования существующей функциональности потребуется некоторое количество работы. –
Вы можете продолжать использовать P/Invoke, где у вас есть, и использовать смешанную сборку смешанного режима для нового кода. Несмотря на это, это не совсем отвечало на вопрос, который я задал. – IInspectable