classpass
, чтобы найти класс, необходимый для разрешения ссылки. В определении расположения заданной сборки CLR полагается на элемент <codeBase>
, связанный с упомянутыми выше конфигурационными файлами. Если такой элемент не предоставлен, то CLR ищет файл (называемый probing) в корневом каталоге приложения, во всех каталогах, перечисленных в конфигурационных файлах элемента <probing>
и во всех подкаталогах корня приложения, которые имеют такое же имя, как и зондируемая сборка. Эти элементы всегда определяются относительно корневого каталога приложения. Отметим, что CLR всегда ищет имя сборки, соединенное с двумя допустимыми расширениями файлов РЕ — .exe
и .dll
.
Наконец, если ссылка сделана на сборку с устойчивым именем, CLR будет искать в глобальном кэше сборок. Устойчивые имена и глобальный кэш сборок мы рассмотрим более подробно в следующем разделе.
Строгие имена и глобальный кэш
Устойчивое (строгое) имя делает сборку глобально уникальной. Оно состоит из идентификатора сборки, открытого ключа и цифровой подписи. Так как сборка, созданная с одним открытым ключом имеет другое имя, чем сборка, созданная с другим открытым ключом, то уникальность имени сборки гарантирована. Нельзя изменить сборку с устойчивым именем, не имея доступа к открытому ключу, использованному при ее создании, следовательно, устойчивое имя гарантирует, что никто не сможет создать другие версии этой сборки. Устойчивые имена предоставляют также жесткий контроль целостности. Создание устойчивого имени является двухшаговым процессом. Сначала необходимо создать или иметь ключевую пару. Создание ключевой пары можно выполнить в командной строке с помощью команды:
sn -k <имя файла ключа>
Например, чтобы создать файл ключа examplekey.key
, надо ввести:
sn -k examplekey.key
После создания файл ключа используется для присвоения устойчивого имени сборке двумя способами. Из командной строки можно использовать утилиту alink
следующим образом:
al /keyfile: <имя файла ключа> <имя сборки>
Чтобы задать для FirstLibrary.dll
строгое имя, можно выполнить:
al /keyfile:examplekey.key FiretLibrary.dll
или в VS.NET изменить атрибут [assembly: AssemblyKeyFile('')]
в файле AssemblyInfo.cs
. Замените просто пустую строку на строку, представляющую имя файла ключа. Сборку FirstLibrary.dll
можно затем ассоциировать с ключом, меняя атрибут AssemblyKeyFile
на [assembly: AssemblyKeyFile('examplekey.key')]
. Какой бы метод ни использовался, конечный результат получается тот же самый. CLR будет устанавливать ключ в файл с помощью Crypto Service Provider (CSP). Работа CSP не представлена в данном приложении.
Все сборки в глобальном кэше сборок должны иметь устойчивое имя. Глобальный кэш сборок применяется для хранения сборок, специально созданных для общего использования несколькими приложениями на машине. Существует несколько способов размещения сборки в глобальном кэше сборок. Можно использовать программу установки, созданную для работы с глобальным кэшем сборок, .NET Framework SDK предоставляет программу установки с именем gacutil.exe
. Чтобы поместить FirstLibrary.dll
в глобальный кэш сборок, воспользуйтесь командой:
gacutil -i FirstLibrary.dll
Можно использовать Проводник Windows для перетаскивания сборок в кэш. Отметим, что необходимо иметь привилегии администратора на машине, чтобы устанавливать сборки в глобальный кэш сборок, независимо от используемого подхода.
Типы данных
Типы данных в Java и в C# можно сгруппировать в две основные категории: типы данных значений и ссылочные типы. Существует только одна категория типа данных значений в Java. Все типы данных значений являются по умолчанию примитивными типами данных языка. C# предлагает более обильный ассортимент. Типы данных значений можно разбить на три основные категории:
□ Простые типы
□ Типы перечислений
□ Структуры
Давайте рассмотрим каждый из них по очереди.
Простые типы
Ранее в разделе оbyte
(отличный от
byte в Java, который имеет знак и отображается в sbyte
в C#), короткое целое без знака ushort
, целое без знака uint
, длинное целое без знака ulong
и, наконец, высокоточное decimal
.
Когда целое число не имеет суффикса, то тип, с которым может быть связано его значение, оценивается в порядке int
, uint
, long
, ulong
, decimal
. Целые значения представляются как десятичные или шестнадцатеричные литералы. В коде ниже результат равен 52 для обоих значений:
int dec = 52;
int hex = 0x34;
Console.WriteLine('decimal {0}, hexadecimal {1}', dec, hex);
char
представляет одиночный символ Unicode длиной два байта. C# расширяет гибкость присваивания символов, допуская присваивание с помощью шестнадцатеричной кодированной последовательности с префиксом х
и представление Unicode с помощью u
. Также нельзя неявно преобразовать символы в целые числа. Все другие обычные кодированные последовательности языка Java полностью поддерживаются.
bool
, boolean
в Java, используются для представления значений true
и false
непосредственно или как результат равенства, как показано ниже:
bool first_time = true;
cool second_time = (counter < 0);
C# вводит тип данных decimal
, который является 128-битовым типом данных, представляющим значения в диапазоне от примерно 1.0×1028 до 7.9×1028. Они предназначены прежде всего для финансовых и денежных вычислений,