2009-05-14 3 views
2

У меня есть приложение ASP.NET, которое использует специальную библиотеку .NET (файл .DLL). Этот .DLL-файл сильно назван. В библиотеке часто появляются небольшие обновления, и я хотел бы иметь возможность обновлять этот .DLL без повторной компиляции приложения. Приложение должно быть предварительно скомпилировано, потому что я не хочу предоставлять его своим клиентам (не то, чтобы его нельзя было декомпилировать, но это тоже не так).Как я могу сказать, что приложение ASP.NET использует любую версию сильно названной сборки?

Это можно сделать как-то? В настоящее время я просто получаю сообщение об ошибке, что .DLL имеет неправильную версию.

ответ

5

Вы можете предоставить им обновленный файл конфигурации, чтобы перейти с новой dll. Эта конфигурация должна иметь настраиваемую политику версии, перенаправляющую запросы с одной DLL на другую. См. this article для получения дополнительной информации.


На самом деле this article имеет больше информации о процессе в целом и различных уровней, которые вы можете определить политику версии в.

+0

Неплохо, но я полагаю, что мне придется предоставить версию для каждой версии .LLL, которую я устанавливаю, правильно? Было бы лучше, если бы я мог просто скопировать новый .DLL, и он будет работать. Но в худшем случае это может сработать. –

+0

К сожалению, я думаю, что это необходимо, чтобы это было сделано так. Это заставляет разработчика подтвердить, что использование новой версии dll было протестировано и не приводит к неожиданному поведению. Другой вариант заключается в том, что он всегда загружает последнюю версию, и вы вернулись в программирование стиля dll hell of C, где обновление для одного приложения может сломать еще один несвязанный. –

+0

Поскольку эта DLL является локальной для моего приложения (не в GAC или системных папках), любой ад был бы моим единственным. Но, да, я хотел рискнуть. : P OK, тогда я сделаю это, я думаю ... –

0

Вы можете использовать отражение для динамической загрузки сборки во время выполнения. Activator.CreateInstance должен сделать трюк.

IMyInterface myObject = (IMyInterface)Activator.CreateInstance("TheAssemblyName", 
              "TheTypeName", 
              null) 

Если вы используете .Net 3.5, вы можете использовать надстройки и расширяемость. Посмотрите здесь: http://msdn.microsoft.com/en-us/library/bb384241.aspx

+0

Нет, я не могу загрузить сборку динамически, потому что я использую ее повсюду. Мне не только пришлось бы переписать половину моего приложения, но и было бы неплохо работать с ним таким образом. И переносить все это в архитектуру AddIn тоже было бы сложно, потому что у .DLL есть hundreads классов, которые я должен использовать. –

+0

Ой, это было бы легко и в реальном мире никогда не бывает слишком просто :) –

0

Может быть, вы можете просто положить сильно типизированных библиотеки DLL в GAC, конец сделать Dll управления версиями, так что старая версия будет всегда доступна и новый будет использоваться только новые скомпилированных приложений , а старые приложения будут использовать свою старую версию dll до тех пор, пока они не будут скомпилированы и развернуты снова.

Надеюсь, это поможет.