Литмир - Электронная Библиотека
A
A

Исследование метаданных типов

Прежде чем приступить к созданию приложений, в которых задействована ваша специальная библиотека .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 (щелкнув правой кнопкой мыши на имени решения и выбрав в контекстном меню пункт AddNew 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, выбрать в контекстном меню пункт AddReference (Добавить►Ссылка) и указать
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");

// Готово. Нажмите любую клавишу для прекращения работы

311
{"b":"847442","o":1}