Язык программирования C#9 и платформа .NET5
Console.ReadLine()End SubОбратите внимание, что объект
способен обращаться к любому открытому члену (такому как свойствоdreamCar), расположенному выше в цепочке наследования, невзирая на тот факт, что базовый класс был определен на совершенно другом языке и находится полностью в другой сборке! Возможность расширения классов за пределы границ сборок в независимой от языка манере — естественный аспект цикла разработки в .NET Core. Он упрощает применение скомпилированного кода, написанного программистами, которые предпочли не создавать свой разделяемый код на языке С#.PetNameОткрытие доступа к внутренним типам для других сборок
Как упоминалось ранее, внутренние (
) классы видимы остальным объектам только в сборке, где они определены. Исключением является ситуация, когда видимость явно предоставляется другому проекту.internalНачните с добавления в проект
нового класса по имениCarLibraryсо следующим кодом:MyInternalClassnamespace CarLibrary{internal class MyInternalClass{}}На заметку! Зачем вообще открывать доступ к внутренним типам? Обычно это делается для модульного и интеграционного тестирования. Разработчики хотят иметь возможность тестировать свой код, но не обязательно открывать к нему доступ за границами сборки.
Использование атрибута assembly
Атрибуты будут более детально раскрыты в главе 17, но пока откройте файл класса
из проектаCar.csи добавьте показанный ниже атрибут и операторCarLibrary:usingusing System.Runtime.CompilerServices;[assembly:InternalsVisibleTo("CSharpCarClient")]namespace CarLibrary{}Атрибут
принимает имя проекта, который может видеть класс с установленным атрибутом. Имейте в виду, что другие проекты не в состоянии "запрашивать" такое разрешение; оно должно быть предоставлено проектом, содержащим внутренние типы.InternalsVisibleToНа заметку! В предшествующих версиях .NET использовался файл класса
, который по-прежнему существует в .NET Core, но генерируется автоматически и не предназначен для потребления разработчиками.AssemblyInfо.csТеперь можете модифицировать проект
, добавив в методCSharpCarClientследующий код:Main()var internalClassInstance = new MyInternalClass();Код работает нормально. Затем попробуйте сделать то же самое в методе
проектаMain():VisualBasicCarClient' Не скомпилируется' Dim internalClassInstance = New MyInternalClass()Поскольку библиотека
не предоставила разрешение видеть внутренние типы, предыдущий код не скомпилируется.VisualBasicCarClientИспользование файла проекта
Еще один способ добиться того же (и можно утверждать, что он в большей степени соответствует стилю .NET Core) предусматривает применение обновленных возможностей файла проекта .NET Core.
Закомментируйте только что добавленный атрибут и откройте файл проекта
. Добавьте в файл проекта узелCarLibrary, как показано ниже:ItemGroup<ItemGroup><AssemblyAttributeInclude="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 доступны через окно свойств проекта. Щелкните правой кнопкой мыши на имени проекта
и выберите в контекстном меню пункт Properties (Свойства). Перейдя на вкладку Package (Пакет), вы увидите значения, которые вводились ранее для настройки сборки. Для пакета NuGet можно установить дополнительные свойства (скажем, принятие лицензионного соглашения и информацию о проекте, такую как URL и местоположение хранилища).CarLibraryНа заметку! Все значения на вкладке Package пользовательского интерфейса Visual Studio могут быть введены в файле проекта вручную, но вы должны знать ключевые слова. Имеет смысл хотя бы раз воспользоваться Visual Studio для ввода всех значений и затем вручную редактировать файл проекта. Кроме того, все допустимые свойства описаны в документации по .NET Core.
В текущем примере кроме флажка Generate NuGet package on build (Генерировать пакет NuGet при компиляции) никаких дополнительных свойств устанавливать не нужно. Можно также модифицировать файл проекта следующим образом:
<PropertyGroup><TargetFramework>net5.0</TargetFramework>