Шрифт:
Интервал:
Закладка:
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>
- Понимание SQL - Мартин Грубер - Базы данных