Имена сборок
Имя сборки хранится в метаданных и в значительной степени влияет на ее область определения и использование в приложениях. Сборки со строгим именем имеют полное имя, в состав которого входит имя сборки, язык и региональные параметры, открытый ключ, номер версии и (необязательно) архитектура процессора. У загружаемых сборок оно часто называется отображаемым именем, и его можно получить через свойство FullName.
Среда выполнения использует сведения об имени для обнаружения сборки и для того, чтобы отличать данную сборку от других сборок с тем же именем. Например, сборка со строгим именем myTypes
может иметь следующее полное имя:
myTypes, Version=1.0.1234.0, Culture=en-US, PublicKeyToken=b77a5c561934e089c, ProcessorArchitecture=msil
В этом примере полное имя указывает, что у сборки myTypes
имеется строгое имя с токеном открытого ключа, значение языка и региональных параметров "Английский (США)" и номер версии 1.0.1234.0. Архитектурой процессора является msil
. Это означает, что должна выполняться JIT-компиляция в 32- или 64-разрядный код в зависимости от операционной системы и процессора.
Совет
Сведения о ProcessorArchitecture
позволяют создавать версии сборок для конкретных процессоров. Можно создавать версии сборок, идентификации которых различаются только архитектурой процессора — например 32-разрядные и 64-разрядные версии. При строгом именовании указывать архитектуру процессора не требуется. Дополнительные сведения см. в разделе AssemblyName.ProcessorArchitecture.
Код, запрашивающий типы в сборке, должен использовать полное имя сборки. Данный подход называется полной привязкой. Частичная привязка, при которой задается только имя самой сборки, при ссылке на сборки в платформе .NET Framework не допускается.
Все ссылки на сборки, составляющие .NET Framework, должны содержать полное имя сборки. Например, для ссылки на сборку System.Data в .NET Framework версии 1.0 необходимо использовать следующее имя:
System.data, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Версия соответствует номеру версии всех сборок .NET Framework, поставлявшихся с .NET Framework версии 1.0. Для сборок .NET Framework значение языка и региональных параметров всегда нейтрально, а открытый ключ совпадает с показанным в приведенном выше примере.
Например, при установке слушателя трассировки для добавления ссылки на сборку в файле конфигурации необходимо использовать полное имя системной сборки .NET Framework:
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
Примечание.
В ходе привязки среда выполнения не различает регистр в именах сборок, но при этом сохраняет его без изменений. Некоторые средства Windows SDK работают с именами сборок с учетом регистра. Оптимальным является такой порядок использования имен сборок, при котором они рассматриваются как регистрозависимые.
Правила именования компонентов приложений
При определении идентификации сборки среда выполнения не учитывает имя файла. Удостоверение сборки, которое состоит из ее имени, версии, языка и региональных параметров, а также строгого имени, должно восприниматься средой выполнения однозначно.
Если, например, сборка myAssembly.exe ссылается на сборку myAssembly.dll, то при вызове myAssembly.exe привязка пройдет корректно. Тем не менее, если другое приложение вызовет myAssembly.exe с помощью метода AppDomain.ExecuteAssembly, при обработке запроса на привязку к сборке myAssembly
, поступившего от myAssembly.exe, среда выполнения определит, что сборка с именем myAssembly
уже загружена. В этом случае сборка myAssembly.dll загружаться не будет. Так как запрашиваемый тип отсутствует в myAssembly.exe, то возникнет исключение TypeLoadException.
Во избежание этой проблемы необходимо следить за тем, чтобы сборки, составляющие приложение, имели разные имена, а сборки с одинаковыми именами располагались бы в разных каталогах.
Примечание.
Если в .NET Framework сборка со строгим именем помещается в глобальный кэш сборок, то имя файла сборки должно соответствовать имени сборки (без учета расширения имени файла, например EXE или DLL). Так, если имя файла сборки — myAssembly.dll, то именем сборки должно быть myAssembly
. Имена закрытых сборок, развертываемых только в корневом каталоге приложения, могут отличаться от соответствующих файловых имен.