Загрузите сборку из другого места, не в GAC
У меня есть несколько приложений, которые должны использовать одну и ту же сборку. Эта сборка может регулярно изменяться, и может быть установлена различными MSIs
, По этой причине я не хочу помещать это в GAC
со временем это может стать кошмаром развертывания.
Если я включу CopyLocal
Атрибут для этой сборки, чтобы НЕТ в приложении, как я могу сказать runtime
где искать сборку?
Например, приложение загружается в C:/Program Files/<some directory>/bin
DLL
в C:/<some other directory>
Можно ли таким образом загрузить assembly
в этом случае?
Я посмотрел на <codebase>
, но я не уверен, что сборка может быть строго подписана. А также probing
Кажется, работает только для частных путей, указанных в подкаталогах приложения?
Пожалуйста, дайте мне знать. Спасибо.
2 ответа
Использование Assembly.LoadFrom
чтобы загрузить сборку в память, вы можете использовать Activator.CreateInstance, чтобы создать экземпляр предпочитаемого вами типа. Для этого вам нужно отражение пользователя:
Assembly assembly = Assembly.LoadFrom("c:\\path\\MyDll.dll");
Type type = assembly.GetType("MyClass");
object instanceOfMyType = Activator.CreateInstance(type);
Посмотрите на отражение для создания экземпляров с параметрами.
Почему вы хотите установить CopyLocal
на "нет"? Обычный способ избежать "ада DLL" (он же "кошмар развертывания") - убедиться, что зависимости DLL скопированы в один каталог с вашей программой. ИМХО, это самый простой и простой способ гарантировать, что вы загружаете нужную вам DLL.
Также обратите внимание, что если вы подписываете DLL, устанавливаете ее в GAC, а затем в вашей собственной программе требуется определенная версия (или минимальная версия, в зависимости от ваших потребностей), что также должно учитывать сценарии "DLL в аду". Т.е. наличие других версий DLL не будет конфликтовать, потому что вам нужна конкретная версия, и.NET может надежно отличить правильную версию от неправильной.
За исключением этих подходов...
Не ясно, каковы ваши точные требования. Однако, если вы пытаетесь предоставить способ идентификации сборки, которая не входит в обычные пути загрузки сборок, существует по крайней мере несколько механизмов, которые вы можете использовать.
Одним из способов является использование ApplicationBase
а также PrivateBinPath
контролировать, как.NET ищет ваши сборки.
Другой способ заключается в том, чтобы справиться с System.AppDomain.AssemblyResolve
событие.
Это событие будет вызываться каждый раз, когда.NET пытается загрузить ссылочную сборку и не может ее найти. Затем ваш обработчик может выполнить любой поиск (или просто использовать фиксированный путь), загрузить саму сборку (например, используя Assembly.LoadFrom()
), а затем вернуть это через объект аргументов события.
Обратите внимание, что AssemblyResolve
Событие возникает, только если.NET не может найти DLL для загрузки. Так что это не будет подходящим решением, если недопустимо иметь другой экземпляр DLL, который удовлетворяет ссылочным требованиям для программы этой DLL.