Тупик в сторонних dll - PullRequest
       4

Тупик в сторонних dll

0 голосов
/ 10 июля 2009

Я использую (и ссылаюсь) два сторонних dll (a.dll и b.dll) в двух моих приложениях на C #. Я получаю повторяющуюся проблему, когда оба приложения зависают при вызове функции из сторонней библиотеки.

Я попытался сделать копию a.dll и b.dll (a2.dll и b2.dll) и использовать ее во втором приложении, но оказывается, что a.dll ссылается на b.dll, anb b .dll ссылается на a.dll, и это не загружается должным образом.

Я подозреваю, что есть тупик, но в сторонней библиотеке. Я не могу использовать блокировку, чтобы предотвратить это. Каждое приложение применяет блокировку, чтобы убедиться, что это приложение имеет только один поток, обращающийся к библиотеке одновременно, но я не могу заблокировать обе программы.

Итак, мой вопрос, как я могу решить эту проблему?

Могу ли я сказать ОС (Windows XP), что я не хочу, чтобы dll делился?

Спасибо, Джо

Ответы [ 4 ]

4 голосов
/ 10 июля 2009

Вы можете ограничить доступ только для одной программы за раз, используя именованный мьютекс. Именованные мьютексы ограничены всей операционной системой, поэтому их можно использовать для предотвращения доступа нескольких процессов.

Подробнее см. Mutex класс .

1 голос
/ 10 июля 2009

Однажды у меня была похожая проблема с прекращенным выпуском стороннего продукта.

Там я использовал дизассемблер и шестнадцатеричный редактор со встроенным ассемблером, чтобы исправить основную ошибку, но это была более или менее удача, потому что причина была чем-то тривиальным, что можно было бы узнать, посмотрев на разборку.

В зависимости от фактической причины, которая может вам подойти.

1 голос
/ 10 июля 2009

1) В одну сторону

  • Создание серверного приложения, которое экспортирует / реализует сторонний API и делает API доступным для других / удаленных процессов (например, с помощью удаленного удаленного взаимодействия или веб-службы для предоставления API через сеть).
  • Внутри серверного приложения внедрите его API, делегировав сторонние DLL
  • Запустите только один экземпляр серверного приложения: поэтому используется только один экземпляр сторонних библиотек DLL
  • Ваши существующие приложения используют API, экспортируемый вашей службой, вместо использования локальных экземпляров сторонних библиотек DLL
  • В вашем сервисе реализуйте блокировки (что вы можете сделать, потому что теперь это внутри одного процесса).

2) Другой способ: использовать вид блокировки, видимый для нескольких процессов (например, класс Mutex).

3) Спросите у поставщиков сторонних DLL-библиотек: должны ли вы одновременно запускать только один экземпляр этой DLL-библиотеки? Если вам разрешено запускать более одного экземпляра, что вы должны сделать, чтобы избежать взаимных блокировок между процессами?

0 голосов
/ 10 июля 2009

Как насчет создания другого потока - который отвечает за доступ к этой DLL ... Таким образом, все приложение не зависает

...