0

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

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

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

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

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

谢谢,乔

4

4 回答 4

4

您可以通过使用命名互斥体来限制访问,因此一次只能访问一个程序。命名互斥锁仅限于整个操作系统,因此可用于防止来自多个进程的访问。

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

于 2009-07-10T19:22:50.450 回答
1

1) 一种方式

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

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

3) 询问第三方 DLL 的供应商:您是否应该一次只能运行该 DLL 的一个实例?如果允许您运行多个实例,您必须如何避免跨进程死锁?

于 2009-07-10T19:29:47.927 回答
1

我曾经在停产的 3rd 方产品上遇到过类似的问题。

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

根据实际原因,这可能是您的一个选择。

于 2009-07-10T19:42:06.323 回答
0

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

于 2009-07-10T19:20:24.933 回答