2009-07-10 9 views
0

私は2つのサードパーティのDLL(a.dllとb.dll)をC#アプリケーションの2つで使用しています(参照しています)。私は、第三者のライブラリ内の関数を呼び出す際に、両方のアプリケーションがハングするという繰り返し可能な問題を抱えています。サードパーティのDLLのデッドロック

私はa.dllとb.dll(a2.dllとb2.dll)のコピーを作成して2番目のアプリケーションで使用しようとしましたが、a.dllがb.dll、anb b.dllはa.dllを参照し、これは正しく読み込まれません。

デッドロックがあると思われますが、第三者のライブラリにあります。私はこれを防ぐためにロックを使用することはできません。各アプリケーションはロックを強制して、一度に1つのスレッドしかライブラリにアクセスしないようにしていますが、両方のプログラムをロックすることはできません。

私の質問は、この問題をどのように解決できるかです。

私は、DLLを共有したくないということをOS(Windows XP)に伝えることはできますか?このDLLにアクセスするための責任がある...その方法は、全体のアプリは

+0

これらの異なるアプリケーションはありますか?その場合、各プロセスがそれを正しく処理するため、シングルスレッドアクセスでは問題はありません。あなたはデッドロックがあると思う理由を明確にすることはできますか? –

答えて

4

あなたはこれだけ単一のプログラムのアクセスを制限することができます凍結しない - 別のスレッドを作成する方法については何

おかげで、 ジョー

+0

これは、サードパーティのDLLのどこかにあるのでしょうか? –

+0

これをコードに入れることができます。基本的にスレッドの同期化のように動作しますが、この方法でリソースシステムを「ロック」することができます。 –

+0

mutexはlock(lockObject)と同じくらい速いですか? –

0

一度に名前付きミューテックスを使用します。名前付きmutexは、オペレーティングシステム全体に制限されるため、複数のプロセスからのアクセスを防ぐために使用できます。

詳細については、Mutex classを参照してください。

+0

私はすでにそれをしています。しかし、私は、各アプリケーションにクリティカルなスレッドが残っていて、両方のアプリケーションは完全にフリーズしていませんが、役に立たないものです。 –

1

1)一つの方法

  • た輸出/サードパーティのAPIを実装し、ドットネットRemotingを使用して、たとえば他/リモートプロセスに利用できるAPI(あるいはウェブを行い、サーバアプリケーションを作成します。サービスを使用して、ネットワーク経由でAPIを公開します)。
  • は、既存のアプリケーションを持って使用されているサードパーティ製のDLLのインスタンスが1つだけので、あります:サーバーアプリケーション内
  • は、サードパーティのDLLを
  • スタートサーバーアプリケーションの唯一のインスタンスに委譲することによって、そのAPIを実装しますサードパーティのDLLのローカルインスタンスを使用する代わりに、サービスでエクスポートされたAPIを使用します。
  • サービス内でロックを実装します(これは現在、1つのプロセス内にあるため可能です)。

2)別の方法:2つ以上のプロセスで表示できる種類のロックを使用します(例:Mutexクラス)。

3)サードパーティのDLLのベンダーに問い合わせてください。一度にこのDLLのインスタンスを1つしか実行できないと思われますか?複数のインスタンスを実行することが許可されている場合、プロセス間のデッドロックを避けるためにはどうしたらいいですか?

+0

1)それは多くの仕事のように聞こえます:-( 2)多分... 3)オープンソースの半放棄ソフトウェアです。彼らは2005年以来アップデートを持っていません。 –

+0

1)あなたが1秒間に5000回それを呼び出すことについて、後で述べたことと非常にうまく対応しません。 – ChrisW

1

私は以前、中止されたサードパーティ製の製品で同様の問題がありました。

ここでは、基本的なバグを修正するためにアセンブラを組み込んだ逆アセンブラと16進エディタを使用しましたが、その原因は分解を見て派生したものではなかったためです。

あなたのオプションである可能性のある実際の原因によっては、

関連する問題