第三方dll死锁

时间:2009-07-10 19:11:38

标签: c# dll deadlock

我在两个C#应用程序中使用(并引用)两个第三方dll(a.dll和b.dll)。我遇到了一个可重复的问题,即两个应用程序在调用第三方库中的函数时挂起。

我试图复制a.dll和b.dll(a2.dll和b2.dll)并在第二个应用程序中使用它,但事实证明a.dll引用了b.dll,anb b .dll引用了a.dll,但无法正常加载。

我怀疑在第三方库中存在死锁。我无法使用锁定来防止这种情况发生。每个应用程序都强制执行锁定以确保该应用程序一次只有一个线程访问该库,但我无法锁定这两个程序。

所以,我的问题是如何解决这个问题?

我可以告诉操作系统(Windows XP)我不想共享dll吗?

谢谢, 乔

4 个答案:

答案 0 :(得分:4)

您可以使用命名的互斥锁限制访问,以便一次只限一个程序。命名互斥锁可以限制整个操作系统,因此可以用来阻止来自多个进程的访问。

有关详细信息,请参阅Mutex class

答案 1 :(得分:1)

1)单程

  • 创建一个服务器应用程序,该应用程序导出/实现第三方API,并使API可用于其他/远程进程(例如,通过使用dot net远程处理或Web服务,以通过网络公开API)。
  • 在服务器应用程序中,通过委派给第三方DLL来实现其API
  • 仅启动服务器应用程序的一个实例:因此只使用了第三方DLL的一个实例
  • 让您现有的应用程序使用您的服务导出的API,而不是使用第三方DLL的本地实例
  • 在您的服务中,实施锁定(您可以使用它,因为它现在只在一个进程中)。

2)另一种方式:使用一种在多个进程中可见的锁(例如Mutex类)。

3)询问第三方DLL的供应商:您是否应该一次只能运行此DLL的一个实例?如果允许您运行多个实例,那么您必须采取哪些措施来避免跨进程的死锁?

答案 2 :(得分:1)

我曾经遇到与已停产的第三方产品类似的问题。

在那里,我使用了一个带有集成汇编程序的反汇编程序和十六进制编辑器来修复底层错误,但这或多或少是运气,因为原因很简单,可以通过查看反汇编来得出。

取决于您可能选择的实际原因。

答案 3 :(得分:0)

如何创建另一个线程 - 负责访问此dll ...这样整个应用程序不会冻结