Сведения о вопросе

Junior

22:28, 8th August, 2020

Теги

.net   gac    

Каковы преимущества и недостатки использования GAC?

Просмотров: 424   Ответов: 7

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



  Сведения об ответе

crush

15:17, 18th August, 2020

  • Загрузка сборок из GAC означает меньшую нагрузку и безопасность, что ваше приложение всегда будет загружать правильную версию библиотеки .NET
  • Вы не должны использовать сборки ngen, которые находятся за пределами GAC, потому что там почти не будет прироста производительности, а во многих случаях даже потери производительности.
  • Вы уже используете GAC, потому что все стандартные сборки .NET на самом деле находятся в GAC и ngened (во время установки).
  • Использование GAC для ваших собственных библиотек добавляет сложности в deployment, я бы постарался избежать этого любой ценой.
  • Ваши пользователи должны быть зарегистрированы как администраторы во время установки, если вы хотите поместить что-то в GAC, что довольно проблематично для многих типов приложений.

Итак, чтобы суммировать все это, начните с простого, и если позже вы увидите значительный прирост производительности, если вы поместите свои сборки в GAC и NGEN их, идите на это, иначе не беспокойтесь. GAC больше подходит для фреймворков, где есть ожидание, что библиотека будет разделена между большим количеством приложений, в 99% случаях она вам не нужна.


  Сведения об ответе

#hash

17:19, 15th August, 2020

Преимущество:

  • Только одно место для обновления вашей сборки
  • Вы используете немного меньше места на жестком диске

Недостаток:

  • Если вам нужно обновить только один сайт, вы не можете. вы можете закончить с другими сайтами в webserver сломанных

Рекомендация: оставьте от GAC до MS и друзей. Гигабайт сейчас стоит очень дешево.


  Сведения об ответе

SKY

15:13, 20th August, 2020

GAC также может использоваться сборками, которым требуются повышенные разрешения для выполнения привилегированных операций от имени менее доверенного кода (например, приложения с частичным доверием ASP.NET).

Например, предположим, что у вас есть приложение с частичным доверием ASP.NET, которое должно выполнить задачу, требующую повышенных привилегий, т. е. полного доверия . Решение состоит в том, чтобы поместить код, требующий повышенных привилегий, в отдельный assembly. assembly помечается атрибутом AllowPartiallyTrustedCallers , А класс, содержащий привилегированную логику, помечается атрибутом PermissionSet, примерно так:

[PermissionSet(SecurityAction.Assert, Unrestricted=true)]

Нашему assembly будет дано строгое имя (подписано), а затем развернуто в GAC.

Теперь наше частично доверенное приложение(ы) может использовать доверенный assembly в GAC для выполнения определенного и узкого набора привилегированных операций, не теряя преимущества частичного доверия.


  Сведения об ответе

screen

10:31, 10th August, 2020

GAC работает с полным доверием и может быть использован приложениями за пределами вашего веб-приложения. Например, задания таймера в Sharepoint HAVE должны быть в GAC, поскольку служба sptimer является отдельным процессом.

Часть "Full Trust" также является возможным источником проблем безопасности. Конечно, вы можете работать с защитой доступа к коду, но я не вижу слишком много сборок, использующих CAS, к сожалению : (папка /bin может быть заблокирована на носителе, что обычно нормально.

Дэниел Ларсон также опубликовал сообщение на CAS , в котором более подробно описываются различия.


  Сведения об ответе

screen

17:06, 1st August, 2020

Если вы отправляете повторно используемую библиотеку, состоящую из нескольких сборок, но только некоторые из них образуют фасад, вы можете рассмотреть возможность установки сборок в GAC, если пакет установлен в PCs разработчика.

Представьте, что вы отправляете 6 сборок, и только одна из этих 6 сборок содержит фасад - т. е. Другие 5 используются только самим фасадом. Вы корабль:

  • MyProduct.Facade.dll - это единственный компонент, предназначенный для использования разработчиками
  • MyProduct.Core.dll-используется MyProduct.Facade.dll, но не предназначен для использования разработчиками
  • MyProduct.Component1.dll-то же самое
  • MyProduct.Component2.dll-то же самое
  • ThirdParty.Lib1.dll-сторонняя библиотека, используемая MyProduct.Component1.dll
  • ThirdParty.Lib2.dll-то же самое
  • и т.д.

Разработчики, использующие ваш проект, хотели бы ссылаться только на MyProduct.Facade.dll в своих собственных проектах. Но когда их проект запускается, он должен иметь возможность загружать все сборки, на которые он ссылается - рекурсивно. Как этого можно достичь? В общем случае они должны быть доступны либо в папке Bin, либо на in GAC:

  • Вы можете попросить разработчиков найти папку установки и добавить ссылки на все N сборок, которые вы туда поместили. Это гарантирует, что они будут скопированы в папку Bin, чтобы быть доступными во время выполнения.
  • Вы можете установить шаблон проекта VS.NET, уже содержащий эти 6 ссылок . Немного сложно, так как вы должны ввести фактический путь к вашим сборкам в этот шаблон перед его установкой. Это может быть сделано только установщиком, так как этот путь зависит от пути установки.
  • Вы можете попросить разработчиков создать специальный шаг после сборки в файле .csproj / .vbproj , копируя необходимые зависимости в папку Bin. Те же недостатки.
  • Наконец, вы можете установить все свои сборки в GAC . В этом случае разработчики должны добавить ссылку только на MyProduct.Facade.dll из своего проекта. Все остальное будет доступно во время выполнения в любом случае.

Примечание: последний вариант не заставляет вас делать то же самое при отправке проекта в production PCs. Вы можете либо отправить все сборки в папку Bin, либо установить их в GAC - все зависит от вашего желания.

Таким образом, описанное решение показывает преимущество использования сторонних сборок в GAC во время разработки. Это никак не связано с производством.

Как вы можете заметить, установка в GAC в основном предназначена для решения проблемы размещения необходимых сборок (зависимостей). Если assembly установлен в GAC, вы можете считать, что он существует "nearby" любое приложение. Это все равно, что добавить путь к .exe в переменную PATH, но в "managed way". - конечно, это довольно упрощенное описание ;)


  Сведения об ответе

repe

15:41, 14th August, 2020

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


  Сведения об ответе

nYU

00:11, 14th August, 2020

За всю мою жизнь у меня было, возможно, одно приложение, где я должен был поместить assembly в GAC, просто потому, что эти сборки были частью фреймворка, что ряд приложений будет использовать его, и казалось правильным поместить их в GAC.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться