Как развернутые программы .NET ссылаются на сборки в GAC?

Лучшая практика для разработки программ .NET, по-видимому, такова: никогда не ссылайтесь на библиотеки DLL из GAC во время разработки.

Однако как мне заставить фактически развернутый продукт ссылаться на библиотеки DLL в GAC? Например, если мой продукт представляет собой очень простое приложение для Windows, то как мне запрограммировать свой код, чтобы единственный развернутый файл .exe ссылался на System.Windows.Forms.dll из GAC?

Я новичок в разработке .NET, поэтому мне могут не хватать некоторых основ.


person Alexander Bird    schedule 18.07.2011    source источник
comment
Лучшая практика для разработки программ .NET, по-видимому, такова: никогда не ссылайтесь на библиотеки DLL из GAC во время разработки. [Требуется ссылка] Мне не нравится добавлять свои собственные сборки в GAC, но я никогда не слышал ничего против ссылок на системные сборки из GAC.   -  person CodesInChaos    schedule 20.07.2011


Ответы (2)


Вы добавляете ссылки из списка в диалоговом окне Add References. Это добавит записи в ваш .csproj, которые выглядят следующим образом:

<ItemGroup>
  <Reference Include="System" />
  <Reference Include="System.Core" />
  <Reference Include="System.Xml.Linq" />
  <Reference Include="System.Data.DataSetExtensions" />
  <Reference Include="Microsoft.CSharp" />
  <Reference Include="System.Data" />
  <Reference Include="System.Xml" />
</ItemGroup>

Вы не отправляете эти dll с вашим проектом. Вы можете отправить установку .net framework для повторной рассылки, но это хорошая идея, только если вы отправляете физические копии своей программы, а не предлагаете загрузку. Включение их в вашу программу, вероятно, является нарушением авторских прав. И, конечно же, в Mono, будущих версиях Windows/.net и т. д. необходимо использовать другую сборку System.Windows.Forms, которая не будет работать, если вы распространяете собственную копию этого файла.

Эти сборки будут загружены из GAC. Но это нормально, поскольку они в конце концов являются частью .net framework. Скомпилированные ссылки будут похожи на mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. Таким образом, фреймворк выберет правильную версию и проследит за тем, чтобы сборки ссылок были получены от правильного создателя.

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

person CodesInChaos    schedule 20.07.2011

Простой ответ — не ссылаться на System.Windows.Forms.dll из GAC. Вместо этого включите эту DLL в свое приложение.

ОБНОВЛЕНИЕ

Если вы хотите добавить ссылки на библиотеки DLL в GAC, вы можете сделать это с помощью обычного диалогового окна добавления ссылок.

Перейдя к C:\Windows\assembly, вы можете выбрать эти ссылки.

person Jamie Dixon    schedule 18.07.2011
comment
Почему? Этот файл обязательно должен быть в системе. - person Lasse V. Karlsen; 18.07.2011
comment
Как это отвечает на вопрос? Я хочу знать, как программы ссылаются на dll в GAC, и похоже, вы говорите, что притворяетесь, что GAC нет, и никогда не используете его. Что мне не хватает? - person Alexander Bird; 18.07.2011
comment
Я обновил свой ответ, добавив немного больше информации о том, как на самом деле ссылаться на библиотеки DLL в GAC. Я не хотел предложить вам никогда не ссылаться на элементы в GAC, я думаю, что просто немного неправильно понял ваш вопрос. - person Jamie Dixon; 18.07.2011
comment
ошибся что? Какого черта он включил системную dll в свое приложение? - person CodesInChaos; 18.07.2011
comment
@CodeInChaos, любая программа, которая создает формы окна для пользователя, должна иметь доступ к System.Windows.Forms.dll во время выполнения, верно? Я действительно новичок в .NET, так где еще программа может получить доступ к этой dll во время выполнения? Буду ли я поставлять System.Windows.Forms.dll со своим приложением? - person Alexander Bird; 20.07.2011
comment
Поскольку Windows Forms является частью .net framework, вы используете уже установленную версию. Вы не отправляете dll с вашей программой напрямую. Вы, вероятно, даже не имеете права сделать это. - person CodesInChaos; 20.07.2011