Язык программирования C#9 и платформа .NET5
Исследование метаданных типов
Прежде чем приступить к созданию приложений, в которых задействована ваша специальная библиотека .NET Core, давайте займемся исследованием метаданных для типов внутри сборки
. Скажем, вот определениеCarLibrary.dllдля типаTypeDef:EnginestateEnumTypeDef #1 (02000002)-------------------------------------------------------TypDefName: CarLibrary.EngineStateEnumFlags : [Public] [AutoLayout] [Class] [Sealed] [AnsiClass]Extends : [TypeRef] System.EnumField #1-------------------------------------------------------Field Name: value__Flags : [Public] [SpecialName] [RTSpecialName]CallCnvntn: [FIELD]Field type: I4Field #2-------------------------------------------------------Field Name: EngineAliveFlags : [Public] [Static] [Literal] [HasDefault]DefltValue: (I4) 0CallCnvntn: [FIELD]Field type: ValueClass CarLibrary.EngineStateEnumField #3-------------------------------------------------------Field Name: EngineDeadFlags : [Public] [Static] [Literal] [HasDefault]DefltValue: (I4) 1CallCnvntn: [FIELD]Field type: ValueClass CarLibrary.EngineStateEnumКак будет объясняться в следующей главе, метаданные сборки являются важным элементом платформы .NET Core и служат основой для многочисленных технологий (сериализация объектов, позднее связывание, расширяемые приложения и т.д.). В любом случае теперь, когда вы заглянули внутрь сборки
, можно приступать к построению клиентских приложений, в которых будут применяться типы из сборки.CarLibrary.dllПостроение клиентского приложения C#
Поскольку все типы в
были объявлены с ключевым словомCarLibrary, другие приложения .NET Core имеют возможность пользоваться ими. Вспомните, что типы могут также определяться с применением ключевого словаpublicязыка C# (на самом деле это стандартный режим доступа в C# для классов). Внутренние типы могут использоваться только в сборке, где они определены. Внешние клиенты не могут ни видеть, ни создавать экземпляры типов, помеченных ключевым словомinternal.internalНа заметку! Исключением из указанного правила является ситуация, когда сборка явно разрешает доступ другой сборке с помощью атрибута
, который вскоре будет рассмотрен.InternalsVisibleToЧтобы воспользоваться функциональностью вашей библиотеки, создайте в том же решении, где находится
, новый проект консольного приложения C# по имениCarLibrary. Вы можете добиться цели с применением Visual Studio (щелкнув правой кнопкой мыши на имени решения и выбрав в контекстном меню пункт Add►New Project (Добавить►Новый проект)) или командной строки (ниже показаны три команды, выполняемые по отдельности):CSharpCarClientdotnet new console -lang c# -n CSharpCarClient -o .\CSharpCarClient -f net5.0dotnet add CSharpCarClient reference CarLibrarydotnet sln .\Chapter16_AppRojects.sln add .\CSharpCarClientПриведенные команды создают проект консольного приложения, добавляют к нему ссылку на проект
и вставляют его в имеющееся решение.CarLibraryНа заметку! Команда
создает ссылку на проект, что удобно на этапе разработки, т.к.add referenceбудет всегда использовать последнюю версиюCSharpCarClient. Можно также ссылаться прямо на сборку. Прямые ссылки создаются за счет указания скомпилированной библиотеки классов.CarLibraryЕсли решение все еще открыто в Visual Studio, тогда вы заметите, новый проект отобразится в окне Solution Explorer безо всякого вмешательства с вашей стороны.
Наконец, щелкните правой кнопкой мыши на имени
в окне Solution Explorer и выберите в контекстном меню пункт Set as Startup Project (Установить как стартовый проект). Если вы не работаете в Visual Studio, то можете запустить новый проект, введя командуCSharpCarClientв каталоге проекта.dotnet runНа заметку! Для установки ссылки на проект в Visual Studio можно также щелкнуть правой кнопкой мыши на имени проекта
в окне Solution Explorer, выбрать в контекстном меню пункт Add► Reference (Добавить►Ссылка) и указатьCSharpCarClientв узле проекта.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");// Готово. Нажмите любую клавишу для прекращения работы