Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Сборками в gac

Использование разделяемых сборок

C# — Сборки .NET — Использование разделяемых сборок

Установка сборок со строгими именами в GAC

Предпочитаемым способом для развертывания сборок в GAC в производственной среде является создание инсталляционного пакета Windows MSI (или применение какой-то коммерческой инсталляционной программы, подобной InstallShield), в .NET Framework 4.0 SDK поставляется работающая утилита командной строки gacutil.ехе, которой удобно пользоваться для проведения быстрых тестов.

Для взаимодействия с GAC на своей машине необходимо иметь права администратора, что может требовать внесения соответствующих изменений в параметры контроля учетных записей пользователей (UAC) в Windows Vista или Windows 7.

Ниже перечислены некоторые наиболее важные опции этой утилиты (для вывода полного списка поддерживаемых ею опций служит флаг /?):

Чтобы инсталлировать сборку со строгим именем с помощью gacutil.exe, нужно открыть в Visual Studio окно командной строки и перейти в каталог, в котором содержится библиотека fontinfo.dll, например:

Затем можно инсталлировать библиотеку с помощью опции -i:

gacutil -i fontinfo.dll

После этого можно проверить, действительно ли библиотека была развернута, выполнив следующую команду (обратите внимание, что расширение файла при использовании опции /l не указывается):

gacutil -1 fontinfo

Если все в порядке, в окне консоли должен появиться примерно такой вывод (разумеется, значение PublicKeyToken будет уникальным):

Просмотр содержимого GAC с помощью проводника Windows

С выходом версии .NET 4.0 кэш GAC был поделен на две части. В частности, в папке С: Windowsassembly теперь размещаются библиотеки базовых классов .NET 1.0 — .NET 3.5 (а также различные дополнительные сборки, в том числе библиотеки сторонних производителей). Однако при компиляции сборки в .NET 4.0 и ее развертывания в GAC с помощью gacutil.ехе она размещается в совершенно новом месте, а именно — в папке С:WindowsMicrosoft.NETassemblyGAC_MSIL.

В этой новой папке также имеется набор подкаталогов, каждый из которых именован в соответствии с дружественным именем конкретной библиотеки кода (например, System.Windows.Forms,- System.Core и т.д.). Внутри каждой папки с дружественным именем размещен еще один подкаталог, который всегда именуется по следующей схеме:

Префикс v4.0 свидетельствует о том, что библиотека компилировалась в версии .NET 4.0. После этого префикса идет один символ подчеркивания, а за ним — номер версии изучаемой сборки, каковым в рассматриваемом примере будет 1.0.0.0 для fontinfo.dll. Далее за парой символов подчеркивания следует значение маркера открытого ключа, основанное на строгом имени. На рисунке показано, как может выглядеть структура каталогов fontinfo в среде Windows XP:

Использование сборки

При создании приложений, использующих разделяемую сборку, единственным отличием от применения приватной сборки является способ, которым должна добавляться ссылка на соответствующую библиотеку в Visual Studio 2010. Фактически для этого используется тот же самый инструмент — диалоговое окно Add Reference. Однако разница в том, что в этом случае упомянутое диалоговое окно не позволяет добавить ссылку на сборку за счет нахождения нужного файла в папке С:WindowsAssembly, которая предназначена только для сборок .NET 3.5 и предшествующих версий.

Опытные разработчики приложений .NET наверняка помнят, что и раньше при переходе в папку С:Windowsassembly в диалоговом окне Add Reference внутри Visual Studio не разрешалось добавлять ссылки на разделяемые библиотеки. По этой причине приходилось создавать отдельную копию библиотеки просто для того, чтобы иметь возможность добавлять на нее ссылку. В Visual Studio 2010 дела обстоят гораздо лучше.

Если необходимо добавить ссылку на сборку, которая была развернута в GAC версии .NET 4.0, на вкладке Browse необходимо перейти в представляющий нужную библиотеку каталог по имени v4.0_major.minor.build.revision_publicKeyTokenValue, как показано на рисунке. С учетом этого немного сбивающего с толку факта, давайте создадим новый проект типа Console Application и добавим в него ссылку на сборку fontinfo только что описанным образом. Как и следовало ожидать, после этого в папке References внутри окна Solution Explorer появится соответствующий значок. Выделив этот значок и выбрав в меню View (Вид) пункт Properties (Свойства), в окне Properties можно увидеть, что свойство Copy Local (Локальная копия) теперь установлено в False.

Несмотря на это, добавим в новое клиентское приложение следующий тестовый код:

Если теперь скомпилировать это клиентское приложение и с помощью проводника Windows перейти в каталог, в котором содержится файл Program.exe, то можно будет увидеть, что среда Visual Studio 2010 не скопировала fontinfo.dll в каталог клиентского приложения. Объясняется это тем, что при добавлении ссылки на сборку, в манифесте которой присутствует значение .publickey, Visual Studio 2010 считает, что данная обладающая строгим именем сборка, скорее всего, будет развертываться в GAC, и потому не заботится о копировании ее двоичного файла.

Исследование манифеста SharedCarLibClient

Вспомните, что при генерировании строгого имени для сборки в ее манифест записывается открытый ключ. В связи с этим, когда в клиентское приложение добавляется ссылка на строго именованную сборку, в ее манифест записывается и компактное хеш-значение всего открытого ключа в маркере .publickeytoken. Поэтому, если открыть манифест Program.exe в утилите ildasm.exe, можно увидеть там следующий код (разумеется, значение открытого ключа в маркере .publickeytoken будет выглядеть по-другому):

Читать еще:  Что такое сборка

Если теперь сравнить значение открытого ключа, записанного в манифесте клиента, и отображаемого в GAC, то легко обнаружить, что они совпадают. Как упоминалось ранее, открытый ключ является одной из составляющих идентификационных данных строго именованной сборки. Из-за этого CLR-среда будет загружать только версию 1.0.0.0 сборки по имени fontinfo, из открытого ключа которой может быть получено хеш-значение DC473F9D2D5D12C3. В случае невозможности обнаружить сборку, соответствующую такому описанию в GAC (и приватную сборку по имени fontinfo в каталоге клиента), будет сгенерировано исключение FileNotFoundException.

Установка сборки в GAC с gacutil.exe

есть сборка с названиям: MyAssebly.dll находится: D:MyAssebly.dll

питаюсь закинуть ее в GAC:
D:>gacutil.exe /i MyAssembly.dll

не получается((((
что не так делаю.

Установка сборки в GAC Windows 7
Не удаётся установить сборку в папку assembly. Пробовал перетаскиванием .dll файла, пишет отказано.

Командная строка не находит GACUTIL.EXE
Привет ребята! Хочу закинуть CarLibrary.dll в GAC, а тут

Запуск из сборки другой сборки(exe)
У меня есть одна большая программа(windows forms) и вторая поменьше(win forms). По нажатию кнопки.

Перенаправление версий сборки. Приложение не читает .exe.config
Всем привет. Читаю Э.Троелсена дошел до главы где он объясняет как перенаправить версию сборки от.

Для начала следует написать, что выводит консоль.

вот что я прописал^^^

Добавлено через 27 секунд
на диске Д єсть: gacutil.exe

И зачем Вы его туда скопировали? Вызывайте из того места где он находится (MS SDK’s по умолчанию), зачем его куда-то копировать?

Регистрация подписанной сборки:

а как проверить єсть ли права админа?

Добавлено через 4 минуты

Добавлено через 1 минуту
This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
как ето понять?
оно хочет другую версию сборки?

Ребята, столкнулся с такой же проблемой.

Пишет
C:UserskavDocumentsVisual Studio 2012ProjectsConsoleApplication2ConsoleApplication2binDebug>sn.exe -T Abstract.dll

Microsoft (R) .NET Framework Strong Name Utility Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.

Public key token is 2350a0854aae3bb2

C:UserskavDocumentsVisual Studio 2012ProjectsConsoleApplication2ConsoleApplication2binDebug>gacutil -i Abstract.dll
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.

Failure adding assembly to the cache: This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

Права администратора есть. Версия .NET на компе 4.5.1. Установление версии в сборке с 4.5.1 на 4.0 (с перекомпиляцией и переподписанием ничего не дает). Visual Studio 2012. Win7 Enterprise

Добавлено через 1 час 28 минут
Все получилось сделать с первого раза из Developer Command Prompt. Как я понял, чего-то нехватало Gacutil.exe когда я запускал её из обычной командной строки.

Добавлено через 9 минут
в MSDN так и написано : «To run the tool, use the Developer Command Prompt (or the Visual Studio Command Prompt in Windows 7). «

Тогда сразу следующий вопрос: а как регить в GAC расшаренную dll на компьютере пользователя?

Глобальный кэш сборок — Global Assembly Cache

Глобальные кэша сборок ( GAC ) является машиной для всей сборки CLI кэша для Common Language Infrastructure (CLI) в .NET Framework от Microsoft. Подход , имеющие специально контролируемое центральное хранилище устраняет недостатки в общей библиотеке концепции и помогает избежать ошибок других решений , которые привели к недостаткам , как DLL ад .

содержание

Требования

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

использование

Есть два способа взаимодействия с GAC: Глобальные кэша сборки (Gacutil.exe) и Ассамблея Cache Viewer (shfusion.dll).

Global Cache Tool Ассамблея

Gacutil.exe это старая утилита командной строки , которая поставляется с .NET 1.1 и по — прежнему доступен с .NET SDK.

Можно проверить наличие общей сборки в GAC с помощью команды:

Можно зарегистрировать общую сборку в GAC с помощью команды:

Или путем копирования файла сборки в следующем месте:

Обратите внимание, что для .NET 4.0 расположение GAC сейчас:

Другие варианты этой утилиты будут кратко описаны, если вы используете /? флаг, то есть:

Просмотр кэша сборок

Новый интерфейс, Ассамблея Cache Viewer, интегрируется в Проводник Windows . Просмотр %windir%assembly (например, C:WINDOWSassembly ) или %WINDIR%Microsoft.NETassembly , отображает узлы , содержащиеся в кэше , наряду с их версиями, культуры, маркер открытого ключа и архитектуры процессора. Агрегаты устанавливаются путем перетаскивания и удаления, выбрав и нажав клавишу удаления или с помощью контекстного меню .

С запуском .NET Framework 4, расширение просмотра кэша сборок оболочки является устаревшим.

Пример использования

Компьютер имеет два CLI сборки и названные AssemblyA , но одна версия 1.0 , а другая версия 2.0. Так как необходимо, чтобы оба быть скомпилированы в файл с именем AssemblyA, они не могут существовать в том же каталоге , в пределах FAT32 файловой системы . Вместо этого, виртуальная файловая система GAC может использоваться программами , которые должны использовать каждую версию сборки специально.

Читать еще:  Как загрузить с флешки ноутбук lenovo

Реализация

GAC как конструкт фактически не существует в ОС Windows. Он реализуется и управляется CLI. Папки в пределах % SystemRoot% по имени узла и Microsoft.NET сборки (для .NET 4.0) содержит все доступные глобально узлы с управляемыми имена файлов , так что могут быть включены версии и открытых ключей лексемы. Таким образом , каждая версия может существовать в том же месте и называться , не требуя последующие версии для сохранения местоположения точек ввода кода , как обычно. Проводник Windows позволяет установить перетащить и падение сборок в эту папку , только если они могли бы быть разрешено устанавливать из командной строки.

Вызывающее приложение может указать версию сборки при обращении, поэтому во время выполнения может просто сослаться на имя файла, чтобы использовать правильный.

Ловушки

Механизм Глобального кэша сборок помогает избежать старого DLL ад , но он все еще имеет некоторые недостатки, такие как:

  • По умолчанию приложение будет работать только с версией .NET Framework , используемой для компиляции, что может привести к ошибке приложения на компьютерах с новыми версиями .NET Framework установлена — даже если приложение будет нормально работать должным образом с новее версия.
  • Иногда необходимо использовать условную компиляцию , если некоторые из основных вызовов (.NET , используемых в приложении) поддерживаются только для некоторых версий рамок.
  • приложения .NET, которые полагаются на нативные несовместимостях код риска, даже с механизмом GAC.
  • Каждый узел , который добавляется в GAC должен быть сильно назван . Процесс изготовления сборки «сильно названный» может быть весьма болезненным в некоторых ситуациях. Например, если сборка зависит от другого узла , который не сильно им, он не может быть зарегистрирован в GAC. В тех случаях , когда код узла третьей стороной не во владении программиста, преобразуя сборку сильно имя на самом деле может оказаться невозможным.
  • Поиск файлов с использованием стандартной для Windows API, не позволяет выбор библиотек DLL, расположенных под «сборочной» папкой, когда Проводник показывает дружественный вид GAC.

Установка сборок в GAC на .NET Framework

Первым шагом при установке сборок в GAC является назначение им строгих имен. После этого сборку можно установить, используя инструмент командной строки .NET под названием gacutil:

Если сборка уже существует в GAC с тем же самым открытым ключом и версией, она обновляется. Предварительного удаления старой сборки в этом случае не требуется.

Ниже показано, как удалить сборку:

Установку сборок в GAC можно задать как часть проекта установки в Visual Studio.

Запуск gacutil с переключателем /l позволяет получить список всех сборок в GAC. То же самое можно сделать с помощью оснастки mscorcfg консоли ММС. После загрузки сборки в GAC приложения могут ссылаться на нее, не нуждаясь в локальной копии этой сборки.

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

GAC и поддержка версий

Изменение атрибута сборки AssemblyVersion дает совершенно новое удостоверение. В целях иллюстрации представим, что вы написали сборку utils, задали ей версию 1.0, назначили ей строгое имя и затем установили ее в GAC. Предположим, что позже вы добавили в сборку несколько новых средств, изменили ее версию на 1.1, перекомпилировали сборку и переустановили ее в GAC. Вместо переписывания исходной сборки GAC теперь содержит сборки обеих версий. Это означает следующее:

• при компиляции другого приложения, использующего сборку utils, можно выбирать, на какую версию ссылаться;

• любое приложение, ранее скомпилированное со ссылкой на сборку utils версии 1.0, продолжит на нее ссылаться.

Это называется выполнением бок о бок. Выполнение бок о бок предотвращает проблему “ада DLL» (DLL hell), которая в противном случае могла бы возникла, когда разделяемая сборка обновляется односторонне: приложения, разработанные для предыдущей версии сборки, могут неожиданно отказать.

Однако сложность возникает, когда требуется применить исправления ошибок или незначительные обновления к существующим сборкам. В такой ситуации существуют два варианта для действий:

• переустановить исправленную сборку в GAC с тем же самым номером версии;

• скомпилировать исправленную сборку с новым номером версии и установить ее в GAC.

Сложность первого варианта связана с невозможностью избирательного применения обновлений к определенным приложениям. Обновления можно применить или ко всем приложениям, или не применять вообще. Сложность второго варианта заключается в том, что приложения не смогут нормально пользоваться более новой сборкой без перекомпиляции. Существует обходной путь: можно создать политику издателя, разрешающую перенаправление версий сборки, но за счет увеличения сложности развертывания.

Выполнение бок о бок хорошо подходит для смягчения некоторых проблем, связанных с разделяемыми сборками. Если вы вообще не будете применять GAC, вместо этого позволив каждому приложению поддерживать собственную копию сборки utils, то устраните все проблемы, связанные с разделяемыми сборками!

Читать еще:  А осборн мозговой штурм

Регистрация сборок в GAC с помощью InstallShield

Я должен зарегистрировать несколько сборок в GAC с помощью InstallSheild, а также мне нужно, чтобы сборки также копировались на INSTALLDIR. Как лучше всего это сделать? Также мне нужно вызвать regasm.exe для assembly; могу ли я сделать это с помощью InstallShield?

Мне действительно нужен новый ‘component’ для каждого assembly, который должен быть зарегистрирован в GAC?

2 Ответа

Этот ответ предполагает, что вы используете тип проекта установщика Windows.

1) Создайте компонент для каждого файла DLL, сделайте его ключевым файлом и установите папку назначения в GlobalAssemblyCache. Это указывает установщику Windows использовать стандартное действие MsiPublishAssemblies, которое в свою очередь вызывает Fusion для регистрации assembly в GAC. Это фактически то, что GACUTIL делает для вас. Помните: GACUTIL не подлежит перераспределению. Если у assembly есть сопутствующие файлы, добавьте их в качестве сопутствующих файлов в тот же компонент.

2) Если ваш assembly равен ComVisible, создайте компонент для каждого DLL, отметьте его как ключевой файл и установите .NET ComInterop в true. Это приведет к тому, что информация COM будет извлечена во время сборки и скажет установщику Windows использовать стандартное действие MsiPublishAssemblies для записи информации в реестр. Примечание: Если у вас есть пользовательский код пользователя в разделе регистрации assembly, это не будет захвачено. Это за MSDN, что regasm /regfile не выполняет этот путь кода. Вам придется вручную ввести эту информацию в представление реестра InstallShield для этого компонента.

3) Да, вы можете развернуть strong-named assembly как глобально, так и приватно. Будет ли виден закрытый или нет, зависит от того, установлен ли assembly с ссылкой UseSpecific или нет.

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

Теоретически, если он находится в GAC, он не нужен вам в каталоге продуктов. Если он находится в GAC, то это будет загруженная версия, а не та, что находится в каталоге продукта. Однако это становится сложнее, если вам нужно, скажем, зарегистрировать его для COM interop тоже. Может быть, я ошибаюсь, но когда я пытался, у меня должны были быть оба: один в справочнике, один в GAC.

Но на самом деле, вам, вероятно, не нужно это в GAC, если вам это нужно в каталоге продуктов. Если он загружается из любой программы в любом месте, всегда, то GAC-это достойное место для него. Если вы помещаете его в GAC для COM interop, это не нужно; Регистрация его, указывая на папку, которую вы установили, будет работать нормально, если вы правильно настроили installshield.

Похожие вопросы:

Я написал несколько кодов с C# и сделать dll файлов. Когда я помещаю свое приложение в другую систему, моему приложению нужны файлы dll рядом с ним .exe файл. Я знаю, что некоторые файлы dll.

Люди, Я понимаю, что это может выглядеть как обычная проблема you didn’t restart your host instance.. но это еще не все. У меня есть приложение BizTalk, которое состоит из пары сборок схемы.

Мне нужно установить тот же assembly на GAC для серверов 30+. Я бы предпочел не иметь RDP для каждого сервера и установить руководство assembly. Существует ли простой способ установки сборок на GAC.

У меня есть большое количество сборок для снятия регистрации с GAC, я бы предпочел не проходить через них по одному за раз. Можно ли использовать подстановочные знаки в gacutil ? (или, сценарий.

В этом ответе есть довольно интересное утверждение: что у вас есть лишние неиспользуемые .NET сборок в GAC ухудшает производительность. В частности, речь идет о следующем случае: в машине GAC есть.

Мне интересно, можно ли зарегистрировать сборки с COM без необходимости регистрировать их с GAC. Нам нужно развернуть некоторые библиотеки .net, которые доступны для классического asp с.

Я пытаюсь развернуть пару сторонних сборок в GAC с WiX. Некоторые из этих сборок являются смешанными сборками. Общий способ сделать это, кажется, установка assembly-атрибут соответствующего файла в.

Как CopyLocal = True работает для сборок, зарегистрированных в GAC? Что делать, если на проект ссылаются две сборки GAC с одинаковым именем?

Как добавить DLL в GAC из проекта InstallScript в InstallShield? Я попытался добавить [GLOBALASSEMBLYCACHE] в качестве пункта назначения к компоненту, но безуспешно. Он говорит мне, что не является.

Я хочу зарегистрировать/отменить регистрацию сборок моего проекта в GAC с помощью проекта установщика установки Visual Studio. Я думаю использовать пользовательский установщик, чтобы использовать.

Ссылка на основную публикацию
Adblock
detector