Каков «правильный» способ регистрации / установки сборки в GAC? - PullRequest
14 голосов
/ 15 октября 2008

Кажется, есть много разных способов регистрации сборок в GAC, например, они «работают». Тем не менее, каков «правильный» способ сделать это?

В ответ на Лу Франко (и gacutil):

Я использую Gacutil для разработки, но мне кажется, что это неправильный способ его установки, поскольку gacutil не входит в базовые утилиты .NET после .NET 1.1 - это всего лишь инструмент разработчика.

Дополнительно: Gacutil (как видно из ответов ниже) не подлежит распространению, и поэтому не должен использоваться в любом приложении, которое вы намереваетесь дать людям, которые не являются разработчиками. АКА, клиенты. См. Это сообщение (и комментарии) Аарона Стебнера .

В ответ на использование WIX:

WIX может быть отличным и все, но как он работает под капотом? Какие детали делают способ установки сборки WIX правильным способом установки? Как это выглядит? Это системный вызов .NET? Есть ли какой-нибудь вызов в dll, похороненном где-то в System32, который нужно сделать?

(Изменить: похоже, WIX использует MSI под капотом. См. Мои комментарии в принятом ответе.)

Окончательное редактирование. Похоже, что для правильной установки сборки в GAC используется установщик Windows и ничего больше. Я собираюсь дать Wix попробовать. Спасибо всем!

Ответы [ 8 ]

17 голосов
/ 15 октября 2008

С Wix я бы сделал что-то вроде этого:


<DirectoryRef Id="MyDirectory" >
    <Component Id="MyComponent" Guid="PUT-GUID-HERE" DiskId="1">
        <File Id="MyAssembly" Name="MyAssembly.dll" Assembly=".net" KeyPath="yes" Source="MyAssembly.dll" />
    </Component>
</DirectoryRef>

Когда вы используете атрибут Assembly = ". Net" для файла в WiX, он создает записи в таблице MsiAssembly и MsiAssemblyName для этого компонента и помечает его как компонент GAC.

2 голосов
/ 16 октября 2008

http://blogs.msdn.com/astebner/archive/2006/11/04/why-to-not-use-gacutil-exe-in-an-application-setup.aspx

Похоже, следует избегать gacutil; это не распространяемое приложение. Вместо этого «правильный» способ их установки, кажется, использует MSI, одним из которых является WIX, опубликованный CheGueVerra или другим скриптом.

2 голосов
/ 15 октября 2008

Используйте метод System.EnterpriseServices.Internal.Publish GacInstall.

Преимущества: кажется внутренним инструментом. Наверное, все делает правильно.

Недостатки: как часть установщика, вам все равно нужно создать и запустить приложение, которое вызывает это (если только созданный вами установщик не является настраиваемым приложением, которое это делает).

0 голосов
/ 15 октября 2008

Лучше всего использовать gacutil -i Library.dll.

Единственная проблема с gacutil заключается в том, что он не входит в стандартный путь системы. Однако он находится в фиксированном месте относительно каталога Windows для данной версии .Net Framework. Таким образом, вы можете использовать следующую командную строку, чтобы выполнить ее из любого места:

%SystemRoot%\Microsoft.Net\Framework\v1.1.4322\gacutil -i

PS: просто скопировать вашу сборку в c: \ windows \ assembly не получится. Проводник показывает только упрощенный вид папки, которая на самом деле содержит много разных папок для разных видов сборок. Копирование в него из установщика не вызовет все операции, выполняемые проводником при перетаскивании. (написано здесь, потому что у меня пока недостаточно репутации, чтобы комментировать другие сообщения).

0 голосов
/ 15 октября 2008

Если вы не хотите обрабатывать gacutil самостоятельно, вы всегда можете создать установочный проект в visual studio.

Но я бы придерживался gacutil.

0 голосов
/ 15 октября 2008

копировать напрямую в% WINDIR% \ Assembly.

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

Недостаток: AFAIK,% WINDIR% \ Assembly просто случается, находится там, где он находится сейчас, и его местоположение может быть изменено. Это может привести к поломке в будущих версиях Windows или в случае изменения поведения этой папки. Это, вероятно, не правильный путь.

Крайний недостаток: Как сказал madmath:

простое копирование вашей сборки в c: \ windows \ assembly не будет работать. Проводник показывает только упрощенный вид папки, которая на самом деле содержит много разных папок для разных видов сборок. Копирование в него из установщика не вызовет все операции, выполняемые проводником при перетаскивании. (написано здесь, потому что у меня пока недостаточно репутации, чтобы комментировать другие сообщения).
0 голосов
/ 15 октября 2008

Разве у вашего установщика нет способа установить сборку в GAC? Я бы сказал, GACUTIL:

http://msdn.microsoft.com/en-us/library/ex0ss12c(VS.80).aspx

0 голосов
/ 15 октября 2008

используйте gacutil.

Преимущества: кажется, всегда работает. Недостатки:

  • должен упаковать дополнительный исполняемый файл вместе с вашим установщиком.
  • Как утилита разработки, похоже, имеет дополнительные побочные эффекты (например, принудительное выполнение установки, несмотря ни на что).
  • НЕ следует включать в любой распространяемый продукт, предоставляемый клиентам.
...