Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программирование » Программирование на Visual C++. Архив рассылки - Алекс Jenter

Программирование на Visual C++. Архив рассылки - Алекс Jenter

Читать онлайн Программирование на Visual C++. Архив рассылки - Алекс Jenter

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 118 119 120 121 122 123 124 125 126 ... 156
Перейти на страницу:

При проектировании .NET была поставлена задача разработать технологию, которая позволила бы решить проблему версий, быстрого развёртывания и изоляции приложений. В основу новой технологии легли сборки (Assembly), которые призваны решить обозначенные выше проблемы.

Что же это такое – сборки (Assembly)?

• Сборки – это наименьшие строительные блоки, на которых базируется платформа .NET.

• Различия в версиях могут существовать только на уровне сборок; предполагается, что внутри сборки никакие элементы (классы, интерфейсы и т. п.) не могут иметь собственные версии.

• Сборки являются хранилищами как для кода, так и для ресурсов.

• Сборки самоописываемы – они содержат метаданные (metadata), которые несут в себе информацию о версии, зависимостях, типах, атрибутах и многое другое.

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

Начнем с манифеста

Манифест – это метаданные, включающие информацию о сборке, а именно:

• Данные о версии – версию, имя и необязательные данные.

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

• Зависимости от других сборок – имена и версии сборок, которые используются данной сборкой. Во время выполнения версии сборок строго сверяются, чтобы удостовериться в том, что загружена именно нужная сборка.

• Экспортируемые типы и ресурсы. Видимость для этих объектов может быть двух типов: только для моей сборки (internal) и для всех (public), включая внешние запросы.

• Свойства защиты. Здесь можно выделить три типа:

 • Права на запуск данной сборки.

 • Некоторые возможности сборки будут недоступны, если она не лицензирована.

 • Сборка должна запускаться только в том случае, если она лицензирована.

ПРИМЕЧАНИЕ

Список файлов, из которых состоит сборка, и зависимости от других сборок – это совершенно разные вещи. Сборка сама по себе может быть разбита на несколько файлов, хотя для тех, кто ее использует, она будет выглядеть как единое целое. То есть, к примеру, общие классы могут лежать в одном файле, ресурсы – в другом, специальные классы – в третьем файле и так далее. Для чего, спрашивается, это нужно? Во-первых, это нужно для гибкой загрузки распределенных приложений, так как файлы, составляющие сборку, могут загружаться по мере необходимости, а не все сразу. Во-вторых, для создания распределённых приложений, так как местоположение файлов не играет никакой роли: файлы из одной и той же сборки могут находиться где угодно: в Интернете, на сетевых дисках и так далее.

Настало время "поработать руками"

Для начала проверьте, правильно ли у вас настроены пути к Visual Studio.Net. Чтобы правильно настроить пути, вам всего лишь необходимо вызывать при загрузке (ну или как вам нравиться) файл vsvars32.bat, который расположен в директории …Microsoft Visual Studio.NETCommon7Tools.

Давайте взглянем на пример который впоследствии нам предстоит скомпилировать и изучать.

• Visual Basic.NET

'File: Some.vb

'Author: Copyright (C) 2001 Dubovcev Aleksey

Imports System

Public Class App

 Public Shared Sub Main()

  Console.WriteLine("Hello World")

 End Sub

End Class

• C#

/* File: Some.cs Author: Copyright (C) 2001 Dubovcev Aleksey */

using System;

public class Application {

 public static void Main() {

  Console.WriteLine("Hello World");

 }

}

• Managed Visual C++

/* File: Some.cpp Author: Copyright (C) 2001 Dubovcev Aleksey */

#using <mscorlib.dll>

using namespace System;

void main() {

 Console::WriteLine("Hello World");

}

Теперь, когда вы построили exe файл, запускайте утилиту ildasm.exe (Intermediate Language Disassembler – дизассемблер промежуточного языка) следующим образом:

ildasm.exe /adv HelloWorld.exe

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

Рис. 1

Вы должны увидеть то же самое, что и на рисунке. Древовидная структура (далее просто дерево) показывает вам сборку изнутри.

[…]

ПРИМЕЧАНИЕ

Тип по значению (Value Type) задается ключевым словом struct и отличается от класса тем, что размещается в стеке, а не в динамической памяти.

Поэкспериментируйте немного с ildasm, чтобы привыкнуть к этой программе. Не пугайтесь при виде каких ни будь непонятных данных, дальше будет еще страшнее. :)

Теперь откройте манифест (manifest) и внимательно посмотрите. Ниже я привожу содержание манифеста, полученное мной при помощи утилиты ildasm.

// Microsoft (R) .NET Framework IL Disassembler. Version 1.0.2914.16

// Copyright (C) Microsoft Corp. 1998-2001. All rights reserved.

// VTableFixup Directory:

// No data.

//Это ссылка на основную библиотеку классов .NET

.assembly extern mscorlib {

 //Это хеш публичного ключа данной сборки

 //он нужен для подтверждения валидности сборки

 .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .zV.4..

 //Версия сборки которая использовалась при создании приложения

 .ver 1:0:2411:0

}

//Описание нашей сборки

.assembly Some {

 // – The following custom attribute is added automatically, do not uncomment –

 // – Следующий атрибут добавлен автоматически, не убирайте комментарий

 // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,

 //  bool) = ( 01 00 00 01 00 00 )

 //Алгоритм по которому считается хэш

 .hash algorithm 0x00008004

 //Версия нашей сборки

 .ver 0:0:0:0

}

//Название запускаемого файла

.module Some.exe

// MVID: {2FA89A98-AD9F-4E31-8DB1-AB1FFB64A4F4}

//Предпочтительный адрес для загрузки сборки

.imagebase 0x00400000

//Подсистема (консоль, оконное приложение, приложение времени загрузки)

.subsystem 0x00000003

//Выравнивание секций

.file alignment 512

//Зарезервированный флаг

.corflags 0x00000001

Что, вам кажется, что это полная чушь? Ошибаетесь, если в этом разобраться, что, кстати, не так уж и трудно, то вам откроется много очень полезной и порой необходимой информации. В начале вы увидите записи со словами .assembly extern, которые описывают зависимости от внешних сборок, необходимых для функционирования этой программы. А данные, идущие далее в блоке, заключённом в фигурных скобках, описывают версию и контрольную сумму сборки. Эти данные берутся из сборок при компиляции программы, что гарантирует использование именно тех сборок, которые использовались при компиляции и тестировании. Далее следует .assembly, но уже без модификатора extern. С этой директивы и начинается описание нашей с вами сборки. Как вы могли догадаться, .ver описывает версию нашей сборки. Ну а .hash algorithm определяет функцию, по которой будет вычисляться хэш, но об этом я расскажу позднее. Затем идут описания имени самого модуля, подсистемы исполнения, информация о выравнивании секций и еще некоторые данные. Полная документация по этому вопросу находится в Framework SDK. Более подробно об устройстве манифеста я расскажу далее.

ПРИМЕЧАНИЕ

На самом деле, .publickeytoken описывает не контрольную сумму файла, а является хэшем (контрольной суммой) публичного ключа автора, создавшего сборку, на которую ссылается ключ .assembly extern.

Давайте "копнём" поглубже

Как же сборка устроена изнутри? Что у нее "под капотом"? Оказывается, не так все и страшно, как вам могло показаться. Сборка помещается внутри файла в формате PE (Portable Executable), то есть внутри DLL или EXE. Здесь все зависит от того, будет ли сборка самостоятельной программой или "библиотекой". Любая сборка импортирует функции из библиотеки mscoree.dll, которая является частью среды исполнения. Исполняемые файлы (EXE) импортируют из этой библиотеки функцию _CorExeMain, которую они вызывают для своего запуска. А происходит это так: как и в любом exe-файле, в нашем присутствует точка входа - это маленькая функция (6 байт), которая призвана передавать управление функции _CorExeMain из библиотеки mscoree.dll. Когда данная функция получает управление, она находит в exe-файле свою точку входа и начинает выполнение с нее. Вы можете проверить все сказанное мною сами при помощи утилиты dumpbin, запустив ее с параметрам /imports. Правда, у файла, скомпилированного на Managed C++, вы можете увидеть много других импортов. Не пугайтесь, это нормально, так как MC++ одновременно поддерживает как управляемые, так и неуправляемые данные (managed/unmanaged data). А значит, может делать самостоятельные системные вызовы в обход CLR.

1 ... 118 119 120 121 122 123 124 125 126 ... 156
Перейти на страницу:
На этой странице вы можете бесплатно скачать Программирование на Visual C++. Архив рассылки - Алекс Jenter торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит