Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для ЯП.doc
Скачиваний:
16
Добавлен:
04.06.2015
Размер:
583.17 Кб
Скачать
  1. ILASM. Применение утилит ILDASM и Reflector. Внутреннее устройство сборок Microsoft .NET.

Приложение всегда состоит из одной или более сборок. Сборка — это функциональная единица, имеющая версию и описание, которую можно использовать в других приложениях. Для каждой сборки можно прописывать отдельные разрешения (подробнее о разрешениях см.лекцию 10).

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

В самом простом случае, сборка — это приложение, которое состоит из одного функционального модуля — класса. В большинстве случаев в приложении может быть несколько сборок, и каждая может иметь свои вспомогательные файлы. При выполнении все сборки приложения должны существовать и к ним должен быть открыт доступ. Каждая сборка должна быть независимой. У любой сборки есть метаданные, которые описывают сборку и содержат версию.

Содержимое сборки можно просмотреть, запустив дизассемблер "Microsoft Intermediate Language Disassembler" (ildasm.exe). Рассмотрим следующий пример — создадим простое консольное приложение, которое выводит на экран строку Hello World:

using System;

namespace SimpleApp

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

Console.WriteLine("Hello World");

}

}

}

Утилиту ildasm.exe можно запустить двумя способами — перейти по адресу C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin и запустить непосредственно файл ildasm.exe или перейти в Пуск\Все программы\ Microsoft Visual Studio .NET 2003 \ Visual Studio .NET Tools \ Visual Studio .NET 2003 Command Prompt и в появившейся командной строке ввести

ildasm.exe

После того как приложение запустится, откроем только что созданную сборку (файл SimpleApp.exe из папки bin/Debug), (рис. 9.1).

Рис. 9.1.  Сборка SimpleApp, открытая с помощью утилиты ildasm.exe

Как мы знаем, у класса всегда есть конструктор. Если он не был создан вручную, компилятор создаст конструктор по умолчанию. В утилите он называется .ctor. Также в созданной нами программе есть метод Main, который принимает строковый массив и не возвращает значений. Щелкаем на методе Main два раза. Открывается окно с MSIL (Microsoft Intermediate Language) кодом этого метода. Здесь видим строковую переменную ldstr со значением "Hello World" и запуск статического метода WriteLine класса Console (рис. 9.2).

Рис. 9.2.  MSIL-код метода Main

На рис. 9.2 я снова привел окно утилиты ildasm.exe: щелкнув на кнопку прокрутки, замечаем номер версии сборки — 1.0.2300.26912.

Частные сборки

Программы, которые написаны на языках, поддерживаемых библиотекой .NET Framework, и на C# в частности, компилируются в код MSIL, которые затем среда CLR (Common Language Runtime) преобразует в машинный код.

Частные сборки отвечают тем же требованиям, что и обычные, но используются они, как правило, только в одном приложении. При этом файл сборки может находиться в корневой или вложенных папках корневого каталога, используемого приложением. Приложение связывается со сборкой по ее частному имени, содержащемуся в коде MSIL. Среда CLR, использующая код MSIL, ищет частную сборку по ее имени.

Частные сборки отвечают тем же требованиям, что и обычные, но предназначены они для использования только в одном приложении и, как правило, лежат в той же папке, что и использующее их приложение. Частная сборка может находиться не только в корневой папке, но и во вложенных папках корневого каталога. Приложение ссылается на частную сборку по ее частному имени, которое содержится в метаданных. Когда среда CLR ищет частную сборку для применения, она использует частное имя сборки для поиска, причем поиск осуществляется в корневом каталоге и дочерних подкаталогах. Среда не будет искать сборку в родительской папке каталога.

Если мы хотим использовать любой путь для размещения сборки, то следует воспользоваться методом LoadFrom класса Assembly и указать ему адрес нахождения файла со сборкой. Класс Assembly находится в пространстве имен System.Reflection.

Сборки со строгим именем

Обычные сборки могут быть без труда декомпилированы, и код в них может быть повторно использован. Для коммерческих приложений это недопустимо. Сборки, подписанные строгим именем, позволяют обеспечить безопасность, защиту кода, облегчить применение их в несколько приложениях, а также управлять версионностью сборок. Строгое имя является уникальным обозначением сборки. Оно гарантирует невозможность замены вашей сборки другой.

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

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

Строгое имя сборки гарантирует ее уникальность и защиту от декомпиляции.

Применение техники отражения (Reflection)

    Отражение (reflection) — это средство С#, которое позволяет получить информацию о типе. Термин отражение произошел от характера процесса: объект класса Туре воспроизводит, или отражает, базовый тип, который он представляет. Для получения интересующей вас информации вы "задаете вопросы" объекту класса Туре, а он возвращает (отражает) для вас информацию, связанную с этим типом. Отражение — мощный механизм, позволяющий узнать характеристики типа, точное имя которого становится известным только во время выполнения программы, и соответствующим образом использовать их. Многие классы, которые поддерживают средство отражения, являются частью интерфейса .NET Reflection API, который определен в пространстве имен System.Reflection. Таким образом, в программы, которые используют средство отражения, обычно включается следующая инструкция: using System.Reflection;

    Класс System.Туре —, "сердце" подсистемы отображения, поскольку он инкапсулирует тип. Он содержит множество свойств и методов, которые можно использовать для получения информации о типе во время выполнения программы. Класс Туре выведен из абстрактного класса System.Reflection.Memberlnfо. В классе Member Info определены следующие абстрактные свойства, которые предназначены только для чтения:

tуре DecianngType - Тип класса или интерфейса, в котором объявляется анализирузмый член. MemberTypes MemberType - Тип члена. string Name - Имя типа. Type ReflectedType - Тип отражаемого объекта.

Обратите внимание на то, что свойство MemberType имеет тип MemberTypes. Свойство MemberTypes представляет собой перечисление, которое определяет значе- ния, соответствующие различным типам членов. Среди прочих они включают сле- дующие: MemberTypes.Constructor MemberTypes.Method MemberTypes.Field MemberTypes.Event MemberTypes.Property Следовательно, тип члена можно определить, опросив свойство MemberType. На- пример, если свойство MemberType содержит значение MemberTypes .Method, значит, интересующий нас член является методом.

    Класс Memberlnf о включает два абстрактных метода: GetCustomAttributes() и IsDefined (). Оба они связаны с атрибутами. К методам и свойствам, определенным в классе Memberlnf о, класс Туре добавляет немало "своих". Ниже перечислены наиболее часто используемые методы, определенные в классе Туре.

Constructorinfо[] GetConstructors() - Получает список конструкторов для заданного типа Eventlnfо[] GetEvents() - Получает список событий для заданного типа Fieldinfо[] GetFields() - Получает список полей для заданного типа Memberinf о [] GetMembers() - Получает список членов для заданного типа Methodinfо[] GetMethods() - Получает список методов для заданного типа

Propertyinfо[] GetProperties() - Получает список свойств для заданного типа

    Теперь ознакомьтесь с наиболее часто используемыми свойствами, определенными в классе Туре.

Assembly Assembly - Получает компоновочный файл для заданного типа TypeAttributesAttributes - Получает атрибуты для заданного типа Tyре BaseType - Получает непосредственный базовый тип для заданного типа string FuliName - Получает полное имя заданного типа bool IsArray Истинно, если заданный тип является массивом

2 . Архитектура платформы .NET. Основные компоненты платформы.

Исходные тексты программ компилируются в так называемое промежуточное представление (intermediate language, часто употребляется сокращение IL или MSIL).

Промежуточное представление содержит всю необходимую информацию о программе, но не привязано к какому-либо определенному языку программирования или к машинному коду какой-либо целевой платформы. Для запуска программы необходимо специальное окружение, которое может исполнять программу (execution engine).

Важной особенностью трансляции в .NET является то, что промежуточное представление не интерпретируется; вместо этого используется механизм just-in-time компиляции, который генерирует машинный код.

Платформа .NET Framework — это интегрированный компонент Windows, который поддерживает создание и выполнение нового поколения приложений и веб-служб XML.При разработке платформы .NET Framework учитывались следующие цели.

  • Обеспечение согласованной объектно-ориентированной среды программирования для локального сохранения и выполнения объектного кода, для локального выполнения кода, распределенного в Интернете, либо для удаленного выполнения.

  • Обеспечение среды выполнения кода, минимизирующей конфликты при развертывании программного обеспечения и управлении версиями.

  • Обеспечение среды выполнения кода, гарантирующей безопасное выполнение кода, включая код, созданный неизвестным или не полностью доверенным сторонним изготовителем.

  • Обеспечение среды выполнения кода, исключающей проблемы с производительностью сред выполнения сценариев или интерпретируемого кода.

  • Обеспечение единых принципов работы разработчиков для разных типов приложений, таких как приложения Windows и веб-приложения.

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

Вместе с платформой .NET Framework 3.5 поставляются следующие компоненты:

• среда CLR и библиотеки базовых классов;

• поддержка универсальных типов и методов;

• компиляторы для C#, Visual Basic, C++ и J#;

• ADO.NET;

• ASP.NET;

• Windows Forms;

• веб-службы.

• Windows Presentation Foundation (WPF).

• Windows Communications Foundation (WCF);

• Windows Workflow Foundation (WF).

• LINQ;

• новые компиляторы для C#, Visual Basic, C++ и J#;

• ASP.NET AJAX.

Среда CLR управляет памятью, выполнением потоков, выполнением кода, проверкой безопасности кода, компиляцией и другими системными службами.Эти средства являются внутренними для управляемого кода, который выполняется в среде CLR.

Библиотека классов платформы .NET Framework представляет собой коллекцию типов, которые тесно интегрируются со средой CLR.Библиотека классов является объектно-ориентированной; предоставляя типы, из которых управляемый код пользователя может наследовать функции

3-4. Компиляция и выполнение приложений на платформе Microsoft .NET.

Общеязыковая исполняющая среда clr (Common Language Runtime)

Возможности среды CLR

Среда CLR управляет памятью, выполнением потоков, выполнением кода, проверкой безопасности кода, компиляцией и другими системными службами.Эти средства являются внутренними для управляемого кода, который выполняется в среде CLR.

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

Среда выполнения обеспечивает управление доступом для кода..Например, пользователи могут доверить исполняемому приложению, внедренному в веб-страницу, воспроизведение анимации на экране или звукозаписи, не позволяя ему при этом получить доступ к личным данным, файловой системе или сети.Таким образом, средства безопасности CLR предоставляют подлинному развернутому в Интернете программному обеспечению исключительно богатые функции.

Среда выполнения также обеспечивает надежность кода, реализуя инфраструктуру строгой типизации и проверки кода, которую называют системой общих типов (CTS).Система общих типов обеспечивает самоописание всего управляемого кода.Различные языковые компиляторы корпорации Майкрософт и независимых изготовителей создают управляемый код, удовлетворяющий системе общих типов .Это означает, что управляемый код может принимать другие управляемые типы и экземпляры, при этом обеспечивая правильность типов и строгую типизацию.

Кроме того, управляемая среда выполнения исключает многие часто возникающие проблемы с программным обеспечением.Например, среда выполнения автоматически управляет размещением объектов и ссылками на объекты, освобождая их, когда они больше не используются.Автоматическое управление памятью исключает две наиболее часто возникающие ошибки приложений: утечки памяти и недействительные ссылки на память.

Среда выполнения также повышает продуктивность разработчиков.Например, программисты могут писать приложения на привычном языке разработки, при этом используя все преимущества среды выполнения, библиотеку классов и компоненты, написанные другими разработчиками на других языках.Это доступно любому производителю компиляторов, обращающихся к среде выполнения.Языковые компиляторы, предназначенные для платформы .NET Framework, делают средства .NET Framework доступными для существующего кода, написанного на соответствующих языках, существенно облегчая процесс переноса существующих приложений.

Хотя среда выполнения разрабатывалась для будущего программного обеспечения, она также поддерживает сегодняшнее и вчерашнее программное обеспечение.Взаимодействие управляемого и неуправляемого кодов позволяет разработчикам использовать необходимые компоненты COM и библиотеки DLL.

Среда выполнения разработана для повышения производительности.Хотя общеязыковая среда выполнения предоставляет многие стандартные службы времени выполнения, управляемый код никогда не интерпретируется.Средство компиляции по требованию (JIT) позволяет всему управляемому коду выполняться на машинном языке компьютера.Между тем диспетчер памяти устраняет возможность фрагментации памяти и увеличивает объем адресуемой памяти для дополнительного повышения производительности.

И наконец, среда выполнения может размещаться в высокопроизводительных серверных приложениях, таких как Microsoft® SQL Server™ и Internet Information Services (IIS).Такая инфраструктура позволяет использовать управляемый код для написания собственной логики программ, пользуясь при этом высочайшей производительностью лучших производственных серверов, которые поддерживают размещение среды выполнения.

Центральной частью каркаса .NET является его Общеязыковая исполняющая среда - Common Language Runtime (CLR), или .NET runtime.

Код, исполняемый под управлением CLR, часто называют управляемым кодом.

Однако перед тем как код сможет исполниться CLR, любой исходный текст (на C# или другом языке) должен быть скомпилирован. Компиляция в .NET состоит из двух шагов:

  1. Компиляция исходного кода в IL.

  2. Компиляция IL в специфический для платформы код с помощью CLR.

Этот двухшаговый процесс компиляции очень важен, потому что наличие IL(управляемого кода) - это ключ ко многим преимуществам .NET.

Промежуточное представление содержит всю необходимую информацию о программе, но не привязано к какому-либо определенному языку программирования или к машинному коду какой-либо целевой платформы. Для запуска программы необходимо специальное окружение, которое может исполнять программу (execution engine).

Важной особенностью трансляции в .NET является то, что промежуточное представление не интерпретируется; вместо этого используется механизм just-in-time компиляции, который генерирует машинный код.

Преобразование может выполняться однократно во время установки приложения

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

очевидно, обеспечивает более высокую скорость выполнения приложения по сравнению

со вторым, но более требователен к дисковой памяти. Впрочем, сегодня, когда в обыч-

обычный настольный компьютер можно установить один — два недорогих диска объемом

60-120 Гбайт, этот фактор не играет существенной роли.

Достоинства: 1 – возможность обработки исключений 2 – универсальность использования разных языков и подключения библиотек. Недостатки: требования высокой производительности.

  1. Атрибуты в .NET. Назначение. Привести примеры использования атрибутов.

Атрибуты предоставляют эффективный метод связывания декларативной информации с кодом (типы, методы, свойства и т. д.).Атрибут, связанный с сущностью программы, может быть запрошен во время выполнения с помощью метода, называемого отражением..Дополнительные сведения см. в разделе Отражение (C# и Visual Basic).

Атрибуты имеют следующие параметры.

  • Атрибуты добавляют в программу метаданные.Метаданные представляют собой сведения о типах, определенных в программе.Все сборки .NET содержат заданный набор метаданных, описывающих типы и члены типов, определенных в сборке.Для задания необходимых дополнительных сведений можно добавить атрибуты.Дополнительные сведения см. в разделе Создание настраиваемых атрибутов (C# и Visual Basic).

  • Один или несколько атрибутов могут применяться к сборкам, модулям или более мелким программным элементам, таким как классы и свойства.

  • Атрибуты могут принимать аргументы точно так же, как методы и свойства.

  • Программа может проверить собственные метаданные или метаданные в других программах с помощью отражения.Дополнительные сведения см. в разделе Обращение к атрибутам с помощью отражения (C# и Visual Basic).

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

Атрибуты могут быть размещены в большинстве объявлений, хотя определенный атрибут может ограничить типы объявлений, в которых он допустим.В C# атрибут задается путем размещения его имени, заключенного в квадратные скобки ([]), перед объявлением сущности, к которой он относится.В Visual Basic атрибуты заключаются в угловые скобки (< >).Их необходимо помещать непосредственно перед элементом, к которому они относятся, на той же строке.

Объявление метода с атрибутом DllImportAttribute выглядит следующим образом.

using System.Runtime.InteropServices;

...

[System.Runtime.InteropServices.DllImport("user32.dll")]

extern static void SampleMethod();

Можно создать собственные настраиваемые атрибуты, задав класс атрибутов, который явно или косвенно наследует от Attribute, что облегчает и ускоряет определение атрибутов в метаданных.Предположим, что необходимо пометить типы именем программиста, который разработал его.Можно задать класс настраиваемых атрибутов Author:

[System.AttributeUsage(System.AttributeTargets.Class |

System.AttributeTargets.Struct)

]

public class Author : System.Attribute

{

private string name;

public double version;

public Author(string name)

{

this.name = name;

version = 1.0;

}

}

В качестве имени класса используется имя атрибута Author.Он является производным от System.Attribute, следовательно, это класс настраиваемых атрибутов.Параметры конструктора являются позиционными параметрами настраиваемых атрибутов.В этом примере name является позиционным параметром.Все открытые поля чтения и записи и свойства являются именованными параметрами.В данном случае version является единственным именованным параметром.Обратите внимание, что атрибут AttributeUsage используется для того, чтобы атрибут Author был действителен только для объявлений классов и struct (Structure в Visual Basic).

Новый атрибут можно использовать следующим образом:

[Author("P. Ackerman", version = 1.1)]

class SampleClass

{

// P. Ackerman's code goes here...

}

  1. Библиотека классов Microsoft .NET Framework. Примеры использования библиотеки классов.

Библиотека классов .NET Framework

Библиотека классов платформы .NET Framework представляет собой коллекцию типов, которые тесно интегрируются со средой CLR.Библиотека классов является объектно-ориентированной; предоставляя типы, из которых управляемый код пользователя может наследовать функции.Это не только упрощает работу с типами .NET Framework, но также уменьшает время, затрачиваемое на изучение новых средств платформы .NET Framework.Кроме того, компоненты независимых производителей можно легко объединять с классами платформы .NET Framework.

Например, в классах коллекций .NET Framework реализуется набор интерфейсов, которые можно использовать для разработки пользовательских классов коллекций.Пользовательские классы коллекций будут без затруднений объединяться с классами .NET Framework.

Как и ожидается от объектно-ориентированной библиотеки классов, типы .NET Framework позволяют решать типовые задачи программирования, включая работу со строками, сбор данных, подключения к базам данных и доступ к файлам.В дополнение к этим обычным задачам библиотека классов содержит типы, поддерживающие многие специализированные сценарии разработки.Например, можно использовать платформу .NET Framework для разработки следующих типов приложений и служб:

  • консольные приложения;См. Построение консольных приложений.

  • приложения с графическим интерфейсом пользователя Windows (Windows Forms);См. Windows Forms.

  • приложения Windows Presentation Foundation (WPF);См. Введение в WPF.

  • приложения ASP.NET;См. Веб-страницы ASP.NET.

  • веб-службы;См. Веб-службы ASP.NET.

  • службы Windows;См. Знакомство с приложениями служб Windows.

  • сервисноориентированные приложения с помощью Windows Communication Foundation (WCF);См. раздел Windows Communication Foundation.

  • приложения поддерживающие бизнес-процессы Windows Workflow Foundation (WF).См. Windows Workflow Foundation.

В большинстве проектов разработки Visual C# интенсивно используется библиотека классов .NET Framework. С ее помощью можно решить задачи доступа к системе и управления строками, создавать элементы управления пользовательского интерфейса Windows Forms и ASP.NET.

Библиотека классов организована в пространства имен, в каждом из которых находятся связанные классы и структуры. Например, пространство именSystem.Drawing содержит многочисленные типы, представляющие шрифты, перья, линии, фигуры, цвета и так далее.

Директивы using и ссылки

Прежде чем можно будет использовать классы заданного пространства имен в программе на C#, в исходный файл с кодом C# потребуется добавитьдирективу using для этого пространства имен. В ряде случаев также потребуется добавить ссылку на библиотеку DLL с этим пространством имен; Visual C# автоматически добавляет ссылки для наиболее распространенные DLL библиотек классов. Добавленные ссылки можно просмотреть в Обозревателе решений под узлом Ссылки. Дополнительные сведения см. в разделе Создание проекта (Visual C#).

После добавления директивы using для пространства имен можно создать экземпляры его типов, методов вызова и реагировать на события так, как если бы они были объявлены в собственном исходном коде. В редакторе кода Visual C# можно также поместить курсор на имя типа или члена и нажать клавишу F1 для просмотра справочной документации. Кроме того, сведения о типах по классам и структурам .NET Framework можно получить при помощи средстваОбозреватель объектов и функции Метаданные как исходный код. Дополнительные сведения см. в разделе Моделирование и анализ кода (Visual C#).

  1. Библиотеки классов ввода/вывода пространства имен System.IO. Примеры использования.

Пространство имен System.IO содержит типы, позволяющие осуществлять чтение и запись в файлы и потоки данных, а также типы для базовой поддержки файлов и папок. Например перечислители FileAttributes Предоставляет атрибуты для файлов и папок. Или классы StreamReader Реализует TextReader, который считывает символы из потока байтов в определенной кодировке.

http://msdn.microsoft.com/ru-ru/library/system.io(v=VS.100).aspx

public string getinfo(string name)

{

try{

string info;

using(System.IO.StreamReader SR =new System.IO.StreamReader("d:\\file.txt"))

{

while ((System.IO.SR.ReadLine()) != name) { System.IO.SR.ReadLine();}

info= System.IO.SR.ReadLine();

}

return info;}

catch{return "";}

}

  1. Взаимодействие с неуправляемым кодом из приложений Microsoft .NET. Варианты применения. Привести примеры использования.

Платформа ссылаться на это услуга, которая позволяет управляемому коду вызывать неуправляемые функции реализованы в динамически подключаемых библиотек (DLL), например, в Win32 API. Она находит и вызывает экспортируемую функцию и маршалы своих аргументов (числа, строки, массивы, структуры и т. д.) через взаимодействие границы по мере необходимости. 

Вызов неуправляемого кода — это служба, которая позволяет управляемому программному коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например, функции библиотек Win32 API.Вызов неуправляемого кода обнаруживает и вызывает экспортируемую функцию и при необходимости выполняет маршалинг ее аргументов (целых чисел, строк, массивов, структур и так далее) через границы взаимодействия.Дополнительные сведения об этой службе см. в разделе Подробное рассмотрение вызова неуправляемого кода.

В этом разделе представлено несколько задач, связанных с использованием неуправляемых функций DLL.Кроме следующих задач, имеются общие аспекты и ссылка, указывающая на дополнительные сведения и примеры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]