Выполнение кода при загрузке сборки

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

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

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

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

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


person okutane    schedule 13.06.2009    source источник


Ответы (3)


Еще пара предложений:

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

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

person Matthew Flaschen    schedule 13.06.2009

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

person hugoware    schedule 13.06.2009