私はDLLに関して少し設計上の問題があります.あなたがそれを呼ぶかもしれないし、ウィキペディアがそれを参照しているように、私は現在、DLL Hellにいます問題は次のとおりです:
複数のモジュールを DLL として実装したシステムを作成しました。これらはアプリケーションで使用され、DLL をロードできますが、すべてが必要なわけではありません。数学のようなことだけが行われている場合は、「Utilities.dll」にリンクしてこれを使用できます。問題は、ロガー/トレーサーを持っていることです。これにより、すべてがファイルとデバッグ コンソールに記録されます。デバッグ コンソールは単なるストリーム出力です。問題は、複数の DLL が同じログ クラスを操作しようとする場合の対処方法です。ログ クラスはこの「Utilities.dll」にあり、「DataManagers.dll」や他の dll などはログ クラス機能も使用したいと考えています。これには、ファイルへのロギングが含まれます。現在、クリティカル セクションを使用して書き込みの衝突が発生しないようにしていますが、クリティカル セクションがユーザーモードで実装されているのを確認しています。カーネル モード オブジェクトを使用するには、ある時点でミューテックスなどに切り替える必要があります。しかし、DLL メモリ全体にログ クラスのインスタンスが複数あるということは、クリティカル セクションを使用するだけでは深刻な問題が発生することを意味します。
私が理解できないのは、Utilities.dll に 1 つずつリンクしなくても、すべての DLL が同じログ クラス インスタンスを使用できるようにする方法です。私はデモ プロジェクトに 8 つの dll をロードしたくありません。これら 8 つすべてがログ クラスでその 1 つの dll を参照するようにします。ログ クラスのようなものがさらに必要な場合、これはちょっとした連鎖反応になります。これを適切に行う方法はありますか?他の DLL 内の DLL 内の静的関数と、同じ「静的」関数を使用する .exe Windows バイナリでクラスの機能を使用することにより、ログファイルへの書き込みやデバッグ コンソールの出力ストリームでさえ衝突しません。
そして、私が完全に間違っていて、不可能なことをしようとしている場合は、私に教えて、できるだけこれに近いものを達成するのを手伝ってください. DLLでSingletonパターンを使用すると、同様の問題が発生することはわかっていますが、これは次の方法で解決されます
私がこれまでに試したこと:
- DLL のクラスを初期化するときに、ログ ライブラリのインスタンスを与えますが、これはすべての静的メンバーを持つクラスの目的を無効にします。
同様のこの質問も見つけました(ライブラリの名前でさえ、私のグローバルツールはそれについてどうですか..)が、それは私の質問に答えておらず、'09からのものであるだけでなく、少し異なるアプローチを持っています. 静的ライブラリの「アプリケーション内のグローバル変数の複数のインスタンス」の動作を模倣するが、DLL を使用する方法は?