C # Динамическая проблема системы DLL - PullRequest
0 голосов
/ 10 июня 2009

У меня есть приложение, которое динамически загружает dll. Приложение и DLL используют Functions.dll, которая может быть другой версией для приложения для каждого dll, но при выполнении приложение и dll все используют одно и то же версия dll (используемая в EXE) и разделяющая статические переменные ...

Как я могу заставить их использовать их собственный Functions.dll (n-версия)?

-Details:

  • Я попытался загрузить dll "сборкой dll = Assembly.LoadFile ("и by "Сборка dll = domaindll.Load ("
  • В Functions.dll все методы и объекты являются статическими
  • Я использую Functions.dll "статически", ссылаясь на VS во всех случаи не динамически
  • Dll и Functions.dll также разработаны на C #

-Кладочная конструкция:

Применение:

Application.EXE
Functions.dll(version 1.2)
DLLS:
    EXAMPLEDLL1:
        EXAMPLEDLL1.DLL
        Functions.dll(version 1.1)
    EXAMPLEDLL2:
        EXAMPLEDLL2.DLL
        Functions.dll(version 1.0)
    EXAMPLEDLL3:
        EXAMPLEDLL3.DLL
        Functions.dll(version 1.2)

Ответы [ 3 ]

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

Вы можете принудительно установить привязку к определенной версии DLL, подписав ее строго. Вы также можете попробовать установить для «Specific Version» значение true в ссылочных свойствах, но, насколько мне известно, это влияет только на привязку во время компиляции, и другую версию можно загрузить во время выполнения, если сборка не имеет строгой подписи.

Это должно помочь вам начать: Подпись со строгим именем для управляемых приложений

Имейте в виду, что любые типы, объявленные в этой dll, не будут эквивалентны типу того же типа в другой версии сборки. Например, если я объявлю класс с именем Foo в Functions.dll, то экземпляр Foo из версии 1.0 не будет того же типа, что и экземпляр Foo из версии 1.1. Что касается CLR, это совершенно разные типы.

Если все, что у вас есть, - это статические функции в сборке, и типы не определены, то все будет в порядке. В противном случае вам нужно искать другой подход.

0 голосов
/ 15 июня 2009

В конце я решил переименовать файл Functions.dll в соответствии с EXAMPLEDLL, который его использует .... Пример: Application.EXE -> FunctionsApplication.dll EXAMPLEDLL1.dll -> FunctionsEXAMPLEDLL1.dll Спасибо за ответы в любом случае ..

Postdata: В другом случае, когда я мог бы правильно подписать dll, я думаю, что ответ Адама Робинсона был бы правильным (и jerryjvl второй ответ).

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

Чтобы сделать это, я думаю, вам придется загружать ваши (примеры) библиотеки DLL в отдельные домены приложений. Выполнение вызовов между доменами AppDomain влечет за собой некоторое снижение производительности, но это неизбежно в сценарии, который вы выделите.

...