Введение в MSIL - Часть 3: Определение типов

Дата публикации 6 авг 2006

Введение в MSIL - Часть 3: Определение типов — Архив WASM.RU

В этой части я объясню, как задаются типы.

Вот минимальный ссылочный тип под названием House ("дом", - прим. пер.).

Код (Text):
  1.  
  2. .class Kerr.RealEstate.House
  3. {
  4.     .method public void .ctor()
  5.     {
  6.         .maxstack 1
  7.        
  8.         ldarg.0 // push "this" instance onto the stack
  9.         call instance void [mscorlib]System.Object::.ctor()
  10.        
  11.         ret
  12.     }
  13. }

Это очень простой тип. Обратите внимание, что вы должны объявить конструктор для ссылочного типа. В отличии от таких языков как C# и C++, ассемблер IL не будет генерировать для вас конструктор автоматически.

Типы задаются с помощью директивы .class, за которой следует заголовок типа. Ключевое слово class используется вместо более интуитивно понятного type в силу исторических причин. Когда вы встречаете в исходном MSIL-коде слово class, просто читайте его как type. Заголовок типа состоит из определённого количества аттрибутов, за которым следует имя типа, который вы определяете. Чтобы задать эквивалент статического класса C#, вы можете написать следующее:

Код (Text):
  1.  
  2. .class abstract sealed Kerr.RealEstate.MortgageCalculator
  3. {
  4.     /* members */
  5. }

abstract и sealed - это атрибуты типа. Нельзя сделать экземпляр абстрактного типа, а запечатанный (sealed) тип не может иметь подтипы. Есть атрибуты, которые служать для контроля видимости, такие как public и private. Есть атрибуты для контроля местоположения поля (field layout), такие как auto и sequential. Полный лист атрибутов можно узнать в спецификации CLI. Многие атрибуты применяются автоматически, что экономит на печати символов. К счастью, эти атрубты по умолчанию достаточно интуитивны, так что вы познакомитесь с ними достаточно быстро. Например, расширение System.ValueType из сборки mscorlib задаёт новый тип значений. Так как CLI требует, что типы значений были запечаны, ассемблер IL автоматически присвоит этот атрибут.

Имя типа в вышеприведённом примере было Kerr.RealEstate.MortgageCalculator. CLI не распознаёт пространства имён сами по себе, скорее речь идёт об использовании полного имени типа. Применённый выше синтаксис поддерживается ассемблером IL, который поставляется с .NET Framework версии 2.0. Если вы работаете с версией 1.x, тогда вам придётся применить директиву .namespace так. как это показано ниже. Обратите внимание, что этот синтаксис также поддерживается в версии 2.0.

Код (Text):
  1.  
  2. .namespace Kerr.RealEstate
  3. {
  4.     .class abstract sealed MortgageCalculator
  5.     {
  6.         /* members */
  7.     }
  8. }

После имени типа у вас есть возможность задать базовый тип. Ключевое слово extend применяется именно с этой целью. Если базовый тип не задан, ассемблер IL автомтически сделает так, что тип будет наследоватья от System.Object из сборки mscorlib. И, наконец, в заголовке типа могут быть указан список интерфейсов, которые будут реализованы в типе и его потомках.

Код (Text):
  1.  
  2. .class Kerr.RealEstate.RoomList
  3.     extends [System.Windows.Forms]System.Windows.Forms.ListView
  4.     implements Kerr.IView
  5. {
  6.     /* members */
  7. }

В этом примере у типа Kerr.RealEstate.RoomList есть базовый тип System.Windows.Forms.ListView, заданный в сборке System.Windows.Forms. Помните, что CLI требует от каждого пользовательского типа расширять ровно один другой тип. Roomlisе также реализует интерфейсный тип Kerr.IView.

С помощью этого введения, вы теперь должны суметь задавать более интересные типы. Чтобы определить интерфейс, просто используйте атрибут interface в заголовке типа. Если вам нужен тип значения, известный в C# как struct, просто расширет тип System.ValueType из сборки mscorlib. Теперь вы видите, почему название директивы .class, возножно, далеко не самое лучшее.

Код (Text):
  1.  
  2. .class interface Kerr.IView
  3. {
  4.     /* members */
  5. }
  6.  
  7. .class Kerr.RealEstate.HouseData
  8.     extends [mscorlib]System.ValueType
  9. {
  10.     /* members */
  11. }
© Кенни Керр, пер. Aquila

0 1.574
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532