2010-02-04 3 views
1

Эта проблема у меня связана с тем, что я вытаскиваю свои волосы. Это связано с тем, что я имел раньше, когда мне нужно написать Mutex that will get destroyed when going out of scope. Оказывается, я был глупым и не нуждался в Mutex - вещи, которые мне нужно было блокировать, не наблюдали бы замок, потому что их фактически вызывали из той же нити. Я не понимал, что из таймера приходит один набор звонков. К сожалению.DLL Hell - Нужно иметь ссылку на C# (DLL) на C DLL из определенного места

Во всяком случае, я занимаюсь некоторыми расследованиями, чтобы помочь сузить причину наших проблем с этой сторонней DLL. Кажется, они считают, что если у нас есть несколько копий их DLL-библиотек (мы будем называть их a.dll и b.dll на данный момент) в разных папках, локально только на сборках C#, которые их используют, тогда жизнь будет хорошей и Наконец я могу вернуться домой и увидеть свою семью.

Предлагаемая структура папок выглядит следующим образом:

+--App folder 
    +--DeviceA.dll 
    +--a.dll (linked to by DeviceA) 
    +--b.dll (linked to by a.dll) 
    +--Device B Folder 
     +--DeviceB.dll 
     +--a.dll 
     +--b.dll 

Моя проблема заключается в том, что даже если DeviceB.dll находится в отдельной папке, когда он загружен, он не загружается и ищет его зависимостей в папке «Устройство B» - вместо этого он выглядит в папке «Приложение». Я действительно должен быть в состоянии гарантировать, что он связывается с совершенно другой DLL, чем тот, который находится в папке App.

Я изучил свойства сборки, прочитал некоторые вещи на манифесте и пока не понял. Возможно ли это? Если я знаю, что DeviceB.dll находится в другой папке, мне нужно установить CurrentDirectory или что-то подобное, чтобы заставить ссылку на DLL в своей собственной папке вместо папки с исполняемой сборкой?

EDIT - факт, что a.dll в "Папке устройства B" должно быть c.dll. Таким образом, ссылки a.dll на ссылки b.dll и c.dll на b.dll. Я не могу изменить это поведение, потому что сторонняя DLL уже скомпилирована для ссылки на b.dll.

ответ

3

После загрузки DLL (на уровне SDK с помощью LoadLibrary) он находится в вашем пространстве процесса. Если вы попытаетесь загрузить его снова, вы просто увеличите количество ссылок. Другими словами, вы не сможете загружать две разные версии одной и той же DLL, поскольку они имеют одинаковое имя модуля.

+0

Я понял, что это не сработает. Bummer ... есть ли способ изменить двоичный файл, чтобы хотя бы взломать систему до тех пор, пока сторонний разработчик не сможет ее исправить (предполагая, что он даже будет?)? – Dave

+0

На самом деле, может быть, я должен кое-что прояснить - я немного слаб в области загрузки DLL и как он работает под капотом. Я не помню DLL, имеющую любое «имя модуля», отличное от имени файла. В моем примере выше у меня есть две разные копии a.dll и b.dll, но я не упомянул, что на самом деле я переименовал зависимости B в c.dll, но b.dll все еще b.dll. Я не могу изменить это, потому что я не могу изменить ссылку на стороннюю DLL. Итак ... да, я думаю, мне не повезло, так как вы говорите, что даже если b.dll находится в другой папке, все равно будет указано то же самое. – Dave

+0

Да, возможно, хотя это большая боль. В DLL-файле DLL есть команда вверху, которая идет «LIBRARY libname». Это имя libname используется как уникальное имя модуля, поэтому, если вы исправляете второй набор DLL, чтобы использовать другое имя lib, это сделает это. Вам также необходимо создать новые .LIB-файлы с помощью ImpLib и скомпилировать их. Однако нет никакой гарантии, что либо DLL будет мирно сосуществовать с самим собой. –

Смежные вопросы