Member 14686752 Ответов: 2

Как C++ DLL отправляет ошибку в C# exe


У меня есть приложение, пользовательский интерфейс которого находится в C#, WPF, и этот пользовательский интерфейс использует DLL c++ для выполнения операций.
Я вызываю методы DLL c++ из своего пользовательского интерфейса в таким образом и это прекрасно работает.
Если DLL C++ получит какое-то исключение или ошибку во время выполнения, то как я могу передать ошибку с некоторым целочисленным значением и строкой обратно в мой c# exe, чтобы c# exe обновил пользовательский интерфейс в соответствии с ошибкой и показал читаемое сообщение пользователю.

Что я уже пробовал:

Я думаю об использовании обратных вызовов, потому что ошибка может прийти в любое время или из любого метода DLL.
Шаг 1: зарегистрируйте метод обратного вызова c# в c++
Шаг 2: всякий раз, когда ошибка или исключение поступали в DLL, вызывайте этот зарегистрированный метод обратного вызова c# из библиотеки DLL c++.
Шаг 3: запустите этот метод обратного вызова в течение бесконечного времени в c# exe и всякий раз, когда ошибка приходит из библиотеки DLL c++, идентифицируйте ошибку с помощью кода ошибки и выполните соответствующие действия.
Я не уверен, что этот подход верен или нет, но если он верен, то как его реализовать.

2 Ответов

Рейтинг:
20

KarstenK

Выполнение бесконечного цикла - это плохой стиль. Вы должны справиться с ошибкой, а затем двигаться, находя выход.

Убедитесь, что ошибка C++ обрабатывается в C++ полностью, и вы только сообщаете C# о возникшей проблеме.

Читайте мою статью о том, как Обратные вызовы между C++ и C#.


Member 14686752

Спасибо за ваш ответ. Да, я использовал делегатов, чтобы избежать бесконечного цикла. Ваша статья дала мне хорошую ссылку для решения моей проблемы.

Рейтинг:
1

steveb

Как правило, любой код ошибки, сгенерированный вызовом API, может быть запрошен с помощью функции GetLastError (), а FormatMessage() может дать текстовое представление этой ошибки с помощью флага FORMAT_MESSAGE_FROM_SYSTEM. Оба из которых вы можете вызвать из приложения C#