第三方DLL中的死锁

问题描述:

我在两个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

您可以限制访问,以便只有一个单独的程序一次使用一个有名的互斥体。被命名的互斥锁可以限制整个操作系统,因此可以用来阻止访问多个进程。详细请参照Mutex class

+0

这是否必须在第三方DLL的某个地方或我的代码? – 2009-07-10 19:42:58

+0

你可以把它放在你的代码中 - 除了你可以用这种方法“锁定”资源系统外,它基本上可以像线程同步一样工作。 – 2009-07-10 19:55:49

怎么样创建另一个线程 - 这是负责访问这个dll ...这样,整个应用程序也不会冻结

+0

我已经这么做了。不过,我在每个应用程序中留下了一个关键线程,两个应用程序 - 尽管不是完全冻结 - 都没用。 – 2009-07-10 19:35:17

1)的一种方法

  • 创建一个服务器应用程序,其中出口/实现第三方API,使提供给其他/远程进程的API(例如,通过使用点Net Remoting的,或web服务,通过网络公开API)。因此有正在使用
  • 有现有应用程序的第三方的DLL只有一个实例:
  • 在服务器应用程序,通过委托给第三方的DLL
  • 启动服务器应用程序只有一个实例实施其API使用由您的服务导出的API,而不是使用第三方DLL的本地实例
  • 在您的服务中,实现锁定(因为它现在在一个进程中)。

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

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

我曾经有一个类似的问题与停产的第三方产品。

那里我使用了一个反汇编程序和一个集成了汇编程序的十六进制编辑器来修复潜在的bug,但那或多或少是运气,因为原因可能是通过查看反汇编得出的。

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