Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 309 310 311 312 313 314 315 316 317 ... 642

  Console.ReadLine()

End Sub

Обратите внимание, что объект dreamCar способен обращаться к любому открытому члену (такому как свойство PetName), расположенному выше в цепочке наследования, невзирая на тот факт, что базовый класс был определен на совершенно другом языке и находится полностью в другой сборке! Возможность расширения классов за пределы границ сборок в независимой от языка манере — естественный аспект цикла разработки в .NET Core. Он упрощает применение скомпилированного кода, написанного программистами, которые предпочли не создавать свой разделяемый код на языке С#.

Открытие доступа к внутренним типам для других сборок

Как упоминалось ранее, внутренние (internal) классы видимы остальным объектам только в сборке, где они определены. Исключением является ситуация, когда видимость явно предоставляется другому проекту.

Начните с добавления в проект CarLibrary нового класса по имени MyInternalClass со следующим кодом:

namespace CarLibrary

{

  internal class MyInternalClass

  {

  }

}

На заметку! Зачем вообще открывать доступ к внутренним типам? Обычно это делается для модульного и интеграционного тестирования. Разработчики хотят иметь возможность тестировать свой код, но не обязательно открывать к нему доступ за границами сборки.

Использование атрибута assembly

Атрибуты будут более детально раскрыты в главе 17, но пока откройте файл класса Car.cs из проекта CarLibrary и добавьте показанный ниже атрибут и оператор using:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("CSharpCarClient")]

namespace CarLibrary

{

}

Атрибут InternalsVisibleTo принимает имя проекта, который может видеть класс с установленным атрибутом. Имейте в виду, что другие проекты не в состоянии "запрашивать" такое разрешение; оно должно быть предоставлено проектом, содержащим внутренние типы.

На заметку! В предшествующих версиях .NET использовался файл класса AssemblyInfо.cs, который по-прежнему существует в .NET Core, но генерируется автоматически и не предназначен для потребления разработчиками.

Теперь можете модифицировать проект CSharpCarClient, добавив в метод Main() следующий код:

var internalClassInstance = new MyInternalClass();

Код работает нормально. Затем попробуйте сделать то же самое в методе Main() проекта VisualBasicCarClient:

' Не скомпилируется

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

' Dim internalClassInstance = New MyInternalClass()

Поскольку библиотека VisualBasicCarClient не предоставила разрешение видеть внутренние типы, предыдущий код не скомпилируется.

Использование файла проекта

Еще один способ добиться того же (и можно утверждать, что он в большей степени соответствует стилю .NET Core) предусматривает применение обновленных возможностей файла проекта .NET Core.

Закомментируйте только что добавленный атрибут и откройте файл проекта CarLibrary. Добавьте в файл проекта узел ItemGroup, как показано ниже:

<ItemGroup>

  <AssemblyAttribute

    Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">

    <_Parameter1>CSharpCarClient</_Parameter1>

  </AssemblyAttribute>

</ItemGroup>

Результат оказывается таким же, как в случае использования атрибута в классе, и считается более удачным решением, потому что другие разработчики будут видеть его прямо в файле проекта, а не искать повсюду в проекте.

NuGet и .NET Core

NuGet — это диспетчер пакетов для .NET и .NET Core. Он является механизмом для совместного использования программного обеспечения в формате, который воспринимается приложениями .NET Core, а также стандартным способом загрузки .NET Core и связанных инфраструктур (ASP.NET Core, EF Core и т.д.). Многие организации помещают в пакеты NuGet свои стандартные сборки, предназначенные для решения сквозных задач (наподобие ведения журнала и построения отчетов об ошибках), с целью потребления в разрабатываемых бизнес-приложениях.

Пакетирование сборок с помощью NuGet

Чтобы увидеть пакетирование в действии, понадобиться поместить библиотеку CarLibrary внутрь пакета и затем ссылаться на пакет из двух клиентских приложений.

Свойства пакета NuGet доступны через окно свойств проекта. Щелкните правой кнопкой мыши на имени проекта CarLibrary и выберите в контекстном меню пункт Properties (Свойства). Перейдя на вкладку Package (Пакет), вы увидите значения, которые вводились ранее для настройки сборки. Для пакета NuGet можно установить дополнительные свойства (скажем, принятие лицензионного соглашения и информацию о проекте, такую как URL и местоположение хранилища).

На заметку! Все значения на вкладке Package пользовательского интерфейса Visual Studio могут быть введены в файле проекта вручную, но вы должны знать ключевые слова. Имеет смысл хотя бы раз воспользоваться Visual Studio для ввода всех значений и затем вручную редактировать файл проекта. Кроме того, все допустимые свойства описаны в документации по .NET Core.

В текущем примере кроме флажка Generate NuGet package on build (Генерировать пакет NuGet при компиляции) никаких дополнительных свойств устанавливать не нужно. Можно также модифицировать файл проекта следующим образом:

<PropertyGroup>

    <TargetFramework>net5.0</TargetFramework>

1 ... 309 310 311 312 313 314 315 316 317 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий