2009-06-13 15 views
2

私はいくつかの巨大なアンマネージドライブラリのラッパーに取り組んでいます。ほとんどすべての関数は、内部のエラーハンドラを深く呼び出すことができます。デフォルトのエラーハンドラはコンソールにエラーを書き込み、abort()関数を呼び出します。この動作はマネージライブラリには望ましくないので、私はデフォルトのエラーハンドラを自分のものに置き換えて、いくつかの例外をスローし、この例外を処理した後にプログラムを通常の実行を続けるようにします。ラップされた関数のいずれかが呼び出される前に、エラーハンドラを変更する必要があります。
ラッパーライブラリーは、ラップされたライブラリーに静的にリンクされた管理対象C++で書かれているため、「何百ものdllインポートがあるタイプ」のようなものはありません。私はまた、ラッパーライブラリーの中のすべてで使用される単一のタイプを見つけることができません。だから、私は必要なコードを実行する単一の型で静的なコンストラクタを定義することで、この問題を解決することはできません。アセンブリのロード時にコードを実行

私は現在、その問題を解決するための二つの方法を参照

  1. はLibrary.Initialize(のようないくつかの静的メソッドを定義します)彼のコードは、ラッパーライブラリのどの部分を使用する前に、クライアントが1回呼び出さなければなりません。

  2. すべてのトップレベル関数で使用される(私はこのサブセットのサイズは25-50型のようなものと思われます)、最も小さなサブセットを見つけ、Library.Initializeを呼び出す静的コンストラクタを追加しますそのシナリオでは内部)をこれらのすべてのタイプに割り当てます。

私はthisthis質問を読んだが、彼らは私を助けてくれませんでした。その問題を解決する適切な方法はありますか?たぶんいい素敵なハックがありますか?

答えて

0

私はあなたの選択肢2が良いと思います。あなたがいくつかの余分な種類で呼び出しを含める場合、それもあります。もちろん、既に呼び出されていれば、Library.initializeを呼び出すことができます。

0

少しのストレッチがありますが、必要な機能だけを公開する独自のラッパークラスを作成することもできます。これらの関数のそれぞれの中で、エラー処理を実行することができます。

1

他の提案のカップル:

  1. は、すべてのラッパークラスのルートとして抽象基本クラスを作成し、基底クラスのコンストラクタで初期化コールを置きます。
  2. すべてのオブジェクトに内部コンストラクタを与え、クライアントがいくつかのファクトリメソッドを使用してインスタンス化し、オブジェクトインスタンスを返す前に初期化を実行するように強制します。
関連する問題