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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 223 224 225 226 227 228 229 230 231 ... 407
class="p1">  // с указанием всех пропущенных аргументов!

  excelApp.get_Range("A1", Type.Missing).AutoFormat(

    Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2,

    Type.Missing, Type.Missing, Type.Missing,

  Type.Missing, Type.Missing, Type.Missing);

  // Потребуется указать все пропущенные необязательные аргументы!

  workSheet.SaveAs(

    $@"{Environment.CurrentDirectory}InventoryManual.xlsx",

    Type.Missing, Type.Missing, Type.Missing,

    Type.Missing, Type.Missing, Type.Missing,

    Type.Missing, Type.Missing, Type.Missing);

  excelApp.Quit();

  Console.WriteLine("The InventoryManual.xslx file has been saved to your app folder");

                  // Файл Inventory.xslx сохранен в папке приложения.

}

На этом рассмотрение ключевого слова dynamic языка C# и среды DLR завершено. Вы увидели, насколько данные средства способны упростить сложные задачи программирования, и (что возможно даже важнее) уяснили сопутствующие компромиссы. Делая выбор в пользу динамических данных, вы теряете изрядную часть безопасности типов, и ваша кодовая база предрасположена к намного большему числу ошибок времени выполнения.

В то время как о среде DLR можно еще рассказать многое, основное внимание в главе было сосредоточено на темах, практичных и полезных при повседневном программировании. Если вы хотите изучить расширенные средства DLR, такие как интеграция с языками написания сценариев, тогда обратитесь в документацию по .NET Core (начните с поиска темы "Dynamic Language Runtime Overview" ("Обзор исполняющей среды динамического языка")).

Резюме

Ключевое слово dynamic позволяет определять данные, идентичность которых не известна вплоть до времени выполнения. При обработке исполняющей средой динамического языка (DLR) автоматически создаваемое "дерево выражения" передается подходящему связывателю динамического языка, а полезная нагрузка будет распакована и отправлена правильному члену объекта.

С применением динамических данных и среды DLR сложные задачи программирования на C# могут быть радикально упрощены, особенно действие по включению библиотек СОМ в состав приложений .NET Core. Было показано, что это предлагает несколько дальнейших упрощений взаимодействия с СОМ (которые не имеют отношения к динамическим данным), в том числе встраивание данных взаимодействия СОМ в разрабатываемые приложения, необязательные и именованные аргументы.

Хотя все рассмотренные средства определенно могут упростить код, всегда помните о том, что динамические данные существенно снижают безопасность к типам в коде C# и открывают возможности для возникновения ошибок времени выполнения. Тщательно взвешивайте все "за" и "против" использования динамических данных в своих проектах C# и надлежащим образом тестируйте их!

Глава 19

Язык CIL и роль динамических сборок

При построении полномасштабного приложения .NET Core вы почти наверняка будете использовать C# (или другой управляемый язык, такой как Visual Basic) из-за присущей ему продуктивности и простоты применения. Однако в начале книги было показано, что роль управляемого компилятора заключается в трансляции файлов кода *.cs в код CIL, метаданные типов и манифест сборки. Как выяснилось, CIL представляет собой полноценный язык программирования .NET Core, который имеет собственный синтаксис, семантику и компилятор (ilasm.ехе).

В текущей главе будет предложен краткий экскурс по родному языку платформы .NET Core. Здесь вы узнаете о различиях между директивой, атрибутом и кодом операции CIL. Затем вы ознакомитесь с ролью возвратного проектирования сборок .NET Core и разнообразных инструментов программирования на CIL. Остаток главы посвящен основам определения пространств имен, типов и членов с использованием грамматики CIL. В завершение главы исследуется роль пространства имен System.Reflection.Emit и объясняется, как можно динамически конструировать сборки (с помощью инструкций CIL) во время выполнения.

Конечно, необходимость работать с низкоуровневым кодом CIL на повседневной основе будет возникать только у очень немногих программистов. Плава начинается с описания причин, по которым изучение синтаксиса и семантики такого языка .NET Core может оказаться полезным.

Причины для изучения грамматики языка CIL

Язык CIL является истинным родным языком платформы .NET Core. При построении сборки .NET с помощью выбранного управляемого языка (С#, VB, F# и т.д.) соответствующий компилятор транслирует исходный код в инструкции CIL. Подобно любому языку программирования CIL предлагает многочисленные лексемы, связанные со структурированием и реализацией. Поскольку CIL представляет собой просто еще один язык программирования .NET Core, не должен вызывать удивление тот факт, что сборки .NET Core можно создавать прямо на CIL и компилировать их посредством компилятора CIL (ilasm.exe).

На заметку! Как было указано в главе 1, ни ildasm.exe, ни ilasm.exe не поставляется вместе с исполняющей средой .NET 5. Получить эти инструменты можно двумя способами. Первый способ — скомпилировать .NET 5 Runtime из исходного кода, находящегося по ссылке https://github.com/dotnet/runtime. Второй и более простой способ загрузить желаемую версию из www.nuget.org. Инструмент ildasm.exe в хранилище NuGet доступен по ссылке https://www.nuget.org/packages/Microsoft.NETCore.ILDAsm/, а ilasm.exe — по ссылке https://www.nuget.org/packages/Microsoft.NETCore.lLAsm/. Убедитесь в том, что выбрали корректную версию (для данной книги необходима версия 5.0.0 или выше). Добавьте NuGet-пакеты ILDasm и lLAsm в свой проект с помощью следующих команд:

dotnet add package Microsoft.NETCore.ILDAsm --version 5.0.0

dotnet add package Microsoft.NETCore.ILAsm --version 5.0.0

Команды на самом деле не добавляют ildasm.exe или ilasm.exe в ваш проект, а помещают их в папку пакетов (в среде Windows):

%userprofile%.nugetpackagesmicrosoft.netcore.ilasm5.0.0runtimesnative

%userprofile%.nugetpackagesmicrosoft.netcore.ildasm5.0.0runtimesnative

Кроме того, оба инструмента версии 5.0.0 включены в папку Chapter_19 внутри хранилища GitHub для настоящей книги.

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

• Умеют дизассемблировать существующую сборку .NET Core, редактировать код CIL в ней и заново компилировать модифицированную кодовую базу в обновленный двоичный файл .NET Core. Скажем, некоторые сценарии могут требовать изменения кода CIL для взаимодействия с расширенными средствами СОМ.

• Умеют строить динамические сборки с применением пространства имен System.Reflection.Emit. Данный API-интерфейс позволяет генерировать в памяти сборку .NET Core, которая дополнительно может быть сохранена на диск. Это полезный прием для разработчиков инструментов, которым необходимо генерировать сборки на лету.

• Понимают аспекты CTS, которые не поддерживаются высокоуровневыми управляемыми языками, но существуют на уровне CIL. На самом деле CIL является единственным языком .NET Core, который позволяет получать доступ ко всем аспектам CTS. Например, за счет использования низкоуровневого кода CIL появляется возможность определения членов и полей глобального уровня (которые не разрешены в С#).

Ради полной ясности

1 ... 223 224 225 226 227 228 229 230 231 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

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