2009-06-13 5 views
2

Я работаю над оберткой для какой-то огромной неуправляемой библиотеки. Почти каждая из его функций может вызывать некоторый обработчик ошибок внутри. Обработчик ошибок по умолчанию записывает ошибку в консоль и вызывает функцию abort(). Такое поведение нежелательно для управляемой библиотеки, поэтому я хочу заменить обработчик ошибок по умолчанию моим собственным, который просто выбросит какое-то исключение и позволит программе продолжить нормальное выполнение после обработки этого исключения. Обработчик ошибок должен быть изменен до того, как будет вызвана какая-либо из завернутых функций.
Библиотека обертки написана в управляемом C++ со статической связью с обернутой библиотекой, поэтому ничего подобного «тип с сотнями импорта dll» присутствует. Я также не могу найти один тип, который используется всем внутри библиотеки обертки. Поэтому я не могу решить эту проблему, указав статический конструктор в одном типе, который будет выполнять код, который мне нужен.Выполнить код при сборке

В настоящее время я вижу два пути решения этой проблемы:

  1. определимся статического метода, как Library.Initialize(), который должен быть вызван один раз клиентом, прежде чем его код будет использовать какую-либо часть библиотеки оболочки ,

  2. Найти минимальное подмножество типов, которое используется каждой функцией верхнего уровня (я думаю, что размер этого подмножества будет чем-то вроде 25-50 типов) и добавить статические конструкторы, вызывающие Library.Initialize (что будет внутренний в этом сценарии) для каждого из этих типов.

Я прочитал this и this вопросы, но они не помогли мне. Есть ли подходящие способы решения этой проблемы? Может быть, какие-то хорошие хаки?

ответ

0

Я думаю, что ваш вариант 2 лучше. Если вы включите вызов в несколько дополнительных типов, пусть будет так. Конечно, у вас была бы функция Library.initialize, если она уже вызвана.

0

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

1

Несколько других предложений:

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