Исследование метаданных типов
Прежде чем приступить к созданию приложений, в которых задействована ваша специальная библиотека .NET Core, давайте займемся исследованием метаданных для типов внутри сборки
CarLibrary.dll
. Скажем, вот определение
TypeDef
для типа
EnginestateEnum
:
TypeDef #1 (02000002)
-------------------------------------------------------
TypDefName: CarLibrary.EngineStateEnum
Flags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]
Extends : [TypeRef] System.Enum
Field #1
-------------------------------------------------------
Field Name: value__
Flags : [Public] [SpecialName] [RTSpecialName]
CallCnvntn: [FIELD]
Field type: I4
Field #2
-------------------------------------------------------
Field Name: EngineAlive
Flags : [Public] [Static] [Literal] [HasDefault]
DefltValue: (I4) 0
CallCnvntn: [FIELD]
Field type: ValueClass CarLibrary.EngineStateEnum
Field #3
-------------------------------------------------------
Field Name: EngineDead
Flags : [Public] [Static] [Literal] [HasDefault]
DefltValue: (I4) 1
CallCnvntn: [FIELD]
Field type: ValueClass CarLibrary.EngineStateEnum
Как будет объясняться в следующей главе, метаданные сборки являются важным элементом платформы .NET Core и служат основой для многочисленных технологий (сериализация объектов, позднее связывание, расширяемые приложения и т.д.). В любом случае теперь, когда вы заглянули внутрь сборки
CarLibrary.dll
, можно приступать к построению клиентских приложений, в которых будут применяться типы из сборки.
Построение клиентского приложения C#
Поскольку все типы в
CarLibrary
были объявлены с ключевым словом
public
, другие приложения .NET Core имеют возможность пользоваться ими. Вспомните, что типы могут также определяться с применением ключевого слова
internal
языка C# (на самом деле это стандартный режим доступа в C# для классов). Внутренние типы могут использоваться только в сборке, где они определены. Внешние клиенты не могут ни видеть, ни создавать экземпляры типов, помеченных ключевым словом
internal
.
На заметку! Исключением из указанного правила является ситуация, когда сборка явно разрешает доступ другой сборке с помощью атрибута
InternalsVisibleTo
, который вскоре будет рассмотрен.
Чтобы воспользоваться функциональностью вашей библиотеки, создайте в том же решении, где находится
CarLibrary
, новый проект консольного приложения C# по имени
CSharpCarClient
. Вы можете добиться цели с применением Visual Studio (щелкнув правой кнопкой мыши на имени решения и выбрав в контекстном меню пункт
Add►
New Project (Добавить►Новый проект)) или командной строки (ниже показаны три команды, выполняемые по отдельности):
dotnet new console -lang c# -n CSharpCarClient -o .\CSharpCarClient -f net5.0
dotnet add CSharpCarClient reference CarLibrary
dotnet sln .\Chapter16_AppRojects.sln add .\CSharpCarClient
Приведенные команды создают проект консольного приложения, добавляют к нему ссылку на проект
CarLibrary
и вставляют его в имеющееся решение.
На заметку! Команда
add reference
создает ссылку на проект, что удобно на этапе разработки, т.к.
CSharpCarClient
будет всегда использовать последнюю версию
CarLibrary
. Можно также ссылаться прямо на сборку. Прямые ссылки создаются за счет указания скомпилированной библиотеки классов.
Если решение все еще открыто в Visual Studio, тогда вы заметите, новый проект отобразится в окне Solution Explorer безо всякого вмешательства с вашей стороны.
Наконец, щелкните правой кнопкой мыши на имени
CSharpCarClient
в окне
Solution Explorer и выберите в контекстном меню пункт
Set as Startup Project (Установить как стартовый проект). Если вы не работаете в Visual Studio, то можете запустить новый проект, введя команду
dotnet run
в каталоге проекта.
На заметку! Для установки ссылки на проект в Visual Studio можно также щелкнуть правой кнопкой мыши на имени проекта
CSharpCarClient
в окне
Solution Explorer, выбрать в контекстном меню пункт
Add►
Reference (Добавить►Ссылка) и указать
CarLibrary
в узле проекта.
Теперь вы можете строить клиентское приложение для использования внешних типов. Модифицируйте начальный файл кода С#, как показано ниже:
using System;
// Не забудьте импортировать пространство имен CarLibrary!
using CarLibrary;
Console.WriteLine("***** C# CarLibrary Client App *****");
// Создать объект SportsCar.
SportsCar viper = new SportsCar("Viper", 240, 40);
viper.TurboBoost();
// Создать объект MiniVan.
MiniVan mv = new MiniVan();
mv.TurboBoost();
Console.WriteLine("Done. Press any key to terminate");
// Готово. Нажмите любую клавишу для прекращения работы