2009-06-13 16 views
2

Ich arbeite an Wrapper für einige große unmanaged Bibliothek. Fast jede seiner Funktionen kann einen Fehler-Handler tief in sich aufrufen. Der Standardfehlerhandler schreibt einen Fehler in die Konsole und ruft die Funktion abort() auf. Dieses Verhalten ist für die verwaltete Bibliothek unerwünscht. Daher möchte ich den Standardfehlerhandler durch meinen eigenen ersetzen, der nur eine Ausnahme auslöst und das Programm nach der Behandlung dieser Ausnahme normal weiterlaufen lässt. Der Fehlerhandler muss geändert werden, bevor eine der umgebrochenen Funktionen aufgerufen wird.
Die Wrapper-Bibliothek ist in verwaltetem C++ mit statischer Verknüpfung zu Wrapped Library geschrieben, also ist nichts wie "ein Typ mit Hunderten von DLL-Importen" vorhanden. Ich kann auch keinen einzigen Typ finden, der von allem in der Wrapper-Bibliothek verwendet wird. Also kann ich dieses Problem nicht lösen, indem ich einen statischen Konstruktor in einem einzigen Typ definiere, der Code ausführen wird, den ich brauche.Code beim Laden der Baugruppe ausführen

ich zur Zeit zwei Möglichkeiten sehen, dieses Problem zu lösen:

  1. einige statische Methode wie Library.Initialize definieren(), die eine Zeit von Client aufgerufen werden muss, bevor sein Code eines beliebigen Teil der Wrapper-Bibliothek verwenden .

  2. Finden Sie die minimale Teilmenge von Typen, die von jeder Funktion auf oberster Ebene verwendet wird (ich denke, die Größe dieser Teilmenge wird etwa 25-50 Typen sein) und statische Konstruktoren Aufruf Library.Initialize (was sein wird intern in diesem Szenario) für jeden dieser Typen.

Ich habe this und this Fragen gelesen, aber sie haben mir nicht geholfen. Gibt es geeignete Möglichkeiten, dieses Problem zu lösen? Vielleicht ein paar nette Hacks verfügbar?

Antwort

0

Ich denke, Ihre Option 2 ist besser. Wenn Sie den Anruf in ein paar zusätzliche Arten einschließen, so sei es. Natürlich, Sie müssten Bibliothek.initialisieren, wenn es bereits aufgerufen wurde.

0

Möglicherweise ein bisschen eine Strecke, aber Sie könnten Ihre eigene Wrapper-Klasse erstellen, die nur die Funktionen, die Sie möchten, verfügbar macht. Innerhalb jeder dieser Funktionen können Sie Ihre Fehlerbehandlung durchführen.

1

Ein paar andere Vorschläge:

  1. Eine abstrakte Basisklasse als die Wurzel für alle Wrapper-Klassen und setzen Sie die initialize Aufruf im Konstruktor für die Basisklasse.
  2. Geben Sie allen Objekten interne Konstruktoren und zwingen Sie Clients, sie durch eine Factory-Methode zu instanziieren und führen Sie dann die Initialisierung durch, bevor Sie eine Objektinstanz zurückgeben.
Verwandte Themen