Создайте свой собственный кэш сборок .NET - PullRequest
4 голосов
/ 04 апреля 2009

В приложении .net, которое я пишу, мне нужно локально кэшировать сборки из разных мест, чтобы мое приложение могло использовать их, даже если исходные места недоступны. Я не могу использовать GAC (в первую очередь потому, что я хочу переносимости, а также потому, что сборки могут быть не подписаны).

Кто-нибудь знает какой-либо код .net, который уже поддерживает эту функцию? Мне нужен кеш, чтобы я мог сказать, есть ли конкретная сборка в кеше, а также обрабатывать разные версии сборок. Вероятно, мне придется прибегнуть к написанию собственного кэша сборок, но я подумал, что задам этот вопрос, потому что я действительно не хочу «изобретать колесо», если это уже было сделано.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2009

Мне пришлось написать собственный кеш сборок ...

Вот основы того, как это работает, чтобы помочь другим, если им нужно реализовать собственный кеш сборок:

  • Кеш - это папка с соответствующим классом оболочки в приложении.
  • Метод установки сборки в кэш возвращает строку 'token' (имя, под которым установлена ​​сборка), которую вызывающая сторона может сохранить и использовать для получения сборки позже.
  • Метод извлечения сборки берет токен и возвращает объект, который инкапсулирует информацию из кэшированной сборки.

При установке сборки сначала сравните биты входящей сборки с битами каждой из уже кэшированных сборок и определите, установлена ​​ли сборка уже (если все биты одинаковы, они, очевидно, должны делать то же самое). Если сборка уже установлена, верните имя ранее кэшированной сборки. Если он еще не установлен, разрешите установку нескольких версий, найдя доступный вариант имени сборки в папке кэша (например, assembly.dll, Assembly - (2) .dll, Assembly - (3) .dll и т. Д.). кэшируйте сборку в папке и возвращайте ее кэшированное имя вызывающей стороне.

Что касается безопасности и строгих имен, в моем приложении не имеет смысла проводить строгую проверку имени, поскольку это было бы то, что Брюс Пайетт называет «смягчение воздействия газонного гнома» (контрмера безопасности, которую злоумышленник может просто обойти. ). Если злоумышленник решит отравить собрание, он также получит доступ к месту, где будет храниться строгое имя, и сможет легко заменить его на свое строгое имя. В результате пользователь несет ответственность за использование сборок только из источников, которым он доверяет. Если пользователь устанавливает вредоносную сборку, это его вина, а не моя. Тем не менее, чтобы обеспечить немного больше защиты для пользователя, использование внешних сборок в моем приложении будет отключено по умолчанию. Однако для других приложений может иметь смысл внедрить строгую проверку имен в качестве дополнительного уровня безопасности.

2 голосов
/ 04 апреля 2009

Проект Mono должен был (ре) реализовать GAC, и он работает в Windows. Я бы начал там.

...