2009-07-10 71 views
0

我在兩個C#應用程序中使用(和引用)兩個第三方DLL(a.dll和b.dll)。我遇到了一個可重複的問題,即在調用第三方庫中的函數時這兩個應用程序都處於掛起狀態。第三方DLL中的死鎖

我試圖製作a.dll和b.dll(a2.dll和b2.dll)的副本並在第二個應用程序中使用它,但事實證明a.dll引用了b.dll,anb b.dll引用a.dll,並且不能正確加載。

我懷疑有一個死鎖,但在第三方庫。我無法使用鎖定來防止這種情況。每個應用程序強制執行鎖定以確保該應用程序一次只有一個線程訪問該庫,但我無法鎖定這兩個程序。

所以,我的問題是我該如何解決這個問題?

我可以告訴操作系統(Windows XP)我不想讓dll共享嗎?

謝謝, 喬

+0

這些不同的應用程序?在這種情況下,您不應該對單線程訪問有任何問題,因爲每個進程都可以正確處理。你能否澄清爲什麼你認爲存在僵局? – 2009-07-10 19:25:13

回答

4

您可以限制訪問,以便只有一個單獨的程序一次使用一個有名的互斥體。被命名的互斥鎖可以限制整個操作系統,因此可以用來阻止訪問多個進程。詳細請參照Mutex class

+0

這是否必須在第三方DLL的某個地方或我的代碼? – 2009-07-10 19:42:58

+0

你可以把它放在你的代碼中 - 除了你可以用這種方法「鎖定」資源系統外,它基本上可以像線程同步一樣工作。 – 2009-07-10 19:55:49

0

怎麼樣創建另一個線程 - 這是負責訪問這個dll ...這樣,整個應用程序也不會凍結

+0

我已經這麼做了。不過,我在每個應用程序中留下了一個關鍵線程,兩個應用程序 - 儘管不是完全凍結 - 都沒用。 – 2009-07-10 19:35:17

1

1)的一種方法

  • 創建一個服務器應用程序,其中出口/實現第三方API,使提供給其他/遠程進程的API(例如,通過使用點Net Remoting的,或web服務,通過網絡公開API)。因此有正在使用
  • 有現有應用程序的第三方的DLL只有一個實例:
  • 在服務器應用程序,通過委託給第三方的DLL
  • 啓動服務器應用程序只有一個實例實施其API使用由您的服務導出的API,而不是使用第三方DLL的本地實例
  • 在您的服務中,實現鎖定(因爲它現在在一個進程中)。

2)另一種方式:使用一種在多個進程中可見的鎖(例如Mutex類)。

3)詢問第三方DLL的供應商:你是否應該能夠一次只運行該DLL的一個實例?如果允許運行多個實例,那麼必須採取什麼措施來避免進程間的死鎖?

1

我曾經有一個類似的問題與停產的第三方產品。

那裏我使用了一個反彙編程序和一個集成了彙編程序的十六進制編輯器來修復潛在的bug,但那或多或少是運氣,因爲原因可能是通過查看反彙編得出的。

取決於可能爲您選擇的實際原因。