Пятница, 26.04.2024, 03:13
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Включение ILDASM
00:46
Включение ILDASM
Включение ILDASM
в качестве внешнего инструмента в VS
ildasm представляет собой внешний инструмент, который может быть включен
в состав Visual Studio.NET. Для этого потребуется перейти в меню Tools | External
Tools, которое имеется в Visual Studio.NET. щелкните мышью кнопку Add в этом
диалоговом окне. Вы увидите строку [New Tool 1] в списке
в окне Menu Contents и текстовое окно Title, предназначен-
ное для ввода текста. Введите в окно Title название ildasm,
затем нажмите на кнопку поиска (...), расположенную спра-
ва от окна Command. В появившемся диалоговом окне Open
пройдите по следующему пути:
С:\Program Files\Microsoft.Net\FrameworkSDK\Bin
<r>d:
Г J
j j
Щелкните мышью на файле ildasm.exe, расположенном
в директории Bin, а затем щелкните на Open. После этого
ildasm появится в списке Menu Contents (см. рис. слева).
Теперь щелкните мышью ОК, и ildasm появится как вы-
бранный вариант в меню Tools в Visual Studio.NET.
Использование ILDASM
После того как ildasm включен
в Visual Studio.NET, к нему можно
обратиться, выбрав пункт меню
Tools | ildasm. ildasm будет выведен
в виде отдельного окна, показанно-
го на рисунке справа.
i f IL DASM
FileJ Vfewrr Help -
Ш
ШИВ
4.
596 Глава 21
Щ S«fe*ar« en tteef IS;]
лт-2
После того как вы нашли файл
shapes.dll, щелкните мышью на
кнопке Open — в главном окне iidasm
появится представление модуля, как
показано на рисунке справа.
В данном окне можно увидеть ма-
нифест и класс shapes. Манифест —
это информация названного модуля.
Воспользуйтесь меню File | Open для поиска
Директории, В КОТОРОЙ нахОДИТСЯ shapes.dll,
и откройте ее. Если для компиляции программы
использовался компилятор командной строки, то
файл shapes.dll будет располагаться в той же
директории, что и исходный файл shapes.cs.
Если вы использовали для этих целей Visual
Studio.NET, то файл shapes.dll будет помещен
в поддиректорию bin вашего проекта, возмож-
но, в поддиректорию Debug, если вы строили
конфигурацию по умолчанию, как показано на
рисунке слева.
1 J C:\BegCSharp\Chapi <
Fib
1 Н Й В C:\BeaCSh3fD\ChaDter21\ShaD
h • MANIFEST
ffl-IP Shapes
.-assembly Shapes
111 •• • .
, | g ] x |
es\bir^Dcb!.n'.ShaDe.,dif^H^H
. : •. >
Ж.
A
F i l e V i e w H e l p
! > M A N I F E S T
В-Щ1 Shapes
Шт«>;й>-.
Triangle
UJ
Иконка Shapes представляет простран-
ство имен shapes; ее изображение изв-
лекается из метаданных типов, содер-
жащихся в данном модуле. Раскройте
просматриваемое дерево, щелкнув
мышью на знаке +, расположенном
перед иконкой shapes (см. рис. слева).
Теперь мы можем увидеть оба класса,
описанные в исходном файле,— circle
И Triangle.
Раскройте изображение каждого из классов,
щелкнув мышью на значках +, расположенных
Соответственно перед Circle И перед Triangle.
Теперь можно увидеть то, что соответствует
созданному коду. Представлены переменные эк-
земпляров Классов — radius ДЛЯ класса Circle
И Base И Height ДЛЯ Класса Triangle, а также ме-
тод Area для обоих классов. Можно видеть стро-
ки, которые окажутся добавленными в исходный
код, например, начинающиеся с .ctor и .class
(см. рис. справа).
При более внимательном рассмотрении, можно
обнаружить, что строки, начинающиеся с .ctor,
на деле соответствуют конструкторам, которые
были определены ДЛЯ классов Circle И Triangle.
I > MANfFEST
В--Щ Shapes
v R«2u,us . priva
. Triangle
|^ .cla&s public auto ansi
-V 8o$e: private fba(64
Ф Height
Ш .d
Щ
Модули .NET 597
Для каждого из них предусмотрено по два конструктора, одному из которых не тре-
буется никаких параметров, а второму должны передаваться параметры, необходи-
мые для инициализации экземпляров переменных. Для класса circle при выводе
содержимого модуля инструментом ildasm конструктору с параметрами передается
единственное значение типа float, которое соответствует следующей строке:
.ctor void(float32)
Для класса Triangle конструктору, использующему параметры, должны переда-
ваться два параметра типа float. Это соответствует следующей строке:
.ctor void(float32, float32)
Строки, начинающиеся с точки, служат директивами в языке MSIL, на который
транслируется код на С#, предназначенный для выполнения в среде .NET. Дирек-
тива .ctor — это инструкция языка MSIL, предназначенная для создания конст-
руктора класса. Не требуется исчерпывающее понимание языка MSIL, для того
чтобы ознакомиться с содержимым модулей; мы просто будем обращать внимание
на некоторые любопытные его особенности, по мере того как они будут встречаться.
В самом верху находится строка со слово MANIFEST; давайте теперь немного
поговорим о манифестах.
Манифесты
В манифесте описываются все файлы или отсеки, из которых состоит данный
модуль (модуль может состоять из нескольких файлов, хотя обычно он состоит
только из одного файла). Что представляется еще более важным, в нем также
описываются те внешние модули, на которые данный модуль ссылается. Например,
если в программе используется System.Data.dll, то этот факт находит отражение
в манифесте. Это значительно облегчает процедуру отслеживания зависимостей
одних модулей от других, что, в свою очередь, существенно упрощает установку
и проверку корректности инсталляции программы. Манифест также позволяет от-
слеживать номер версии модуля, что облегчает обновление программы. Рассмот-
рим манифест только что созданного модуля.
Щелкните два раза мышью на стро-
ке MANIFEST, расположенной в самой
верхней части листинга, выведенного
ildasm для shapes.dll. Это приведет
к открытию нового окна, в котором бу-
дут содержаться подробности, относя-
щиеся к манифесту (см. рис. справа).
В манифесте для shapes.dll содер-
жатся две директивы .assembly и одна
директива .module. Пока не следует
беспокоиться по поводу содержимого
блоков .assembly, т. е. временно мож-
но не обращать внимания на то, что
содержится внутри фигурных скобок.
Самая первая строка выглядит следую-
щим образом:
.assembly extern mscorlib
ioflttribute:: .ct
y i j r i t o t t t e : :»etor
ft.Reflection..tosewblyCopyriglvfcfct tribute::.ctoi
111>.Mm«HyPrq<<*mtU'ilwilf I : . c t
b l C ( ) t t i b t t
.emstaM instance uoiti jflscorll6>3Xy!>ve**..Rf?f-lee t ie a*ftsst^eiyoeseripfcioftftttribufce::.et«;
insl'dRce void jBscorXibj|Systi!;t»».R^flPctioE>,ft55eR{iXjjTitlefttt;ributiei;:.ctor(st>''<:
// —•» 1h? following ctiutoft at t r i b u t e Is A$d**d ДШОШ t i tally» do not uncttnm»nt 1
// H
598 Глава 21
Эта строка представляет собой внешнюю ссылку на модуль mscoriib.dll, которая
располагается в том же месте, где описывается большинство основополагающих
классов System в .NET Framework. Такая внешняя ссылка является необходимой
для каждой программы на С# и в .NET, если в ней используются классы System.
Строка .assembly shapes является объявлением самого модуля shapes. За ней сле-
дует объявление файла shapes.dll — строка .module. Наш модуль состоит всего
лишь из одного файла, поэтому в нем содержится всего одно объявление .module.
Посмотрим, что произойдет, если добавить в исходный код дополнительную
ссылку. Предположим, что требуется нарисовать некую геометрическую фигуру с
применением одного из методов, описанных в пространстве имен system.Drawing.
Закройте окно iidasm и вернитесь в проект Visual Studio.NET shapes. Внесите
следующие изменения в файл shapes.cs. Во-первых, добавьте директиву using,
Ссылающуюся на Пространство имен System.Drawing!
namespace Shapes
{
us ing Sys t em.Drawing;
public class Circle
{
Затем добавьте метод Draw о для класса circle сразу после метода Area о :
public void Draw()
{
Pen p = new Pen (Color. Red) ;
<|
Этого кода совершено недостаточно, для того чтобы что-нибудь нарисовать на са-
мом деле, но теперь вы понимаете к чему мы клоним!
Теперь требуется ВКЛЮЧИТЬ В проект ССЫЛКу на МОДУЛЬ System.Drawing.dll.
Если этого не сделать, то мы увидим следующее сообщение об ошибке:
error CS0234: The type or namespace name 'Drawing' does not exist in the class or namespace
(ошибка CS0234: Название типа или пространства имен 'Drawing' отсутствует в классе или )
'System' (are you missing an assembly reference?)
(в пространстве имен 'System' (возможно, вы забыли указать ссылку на модуль? ))
Для добавления ссылки в VS, выбери-
те пункт меню Project | Add Reference....
Внешний вид диалога Add Reference изоб-
ражен на рисунке слева. Вкладка .NET по-
зволяет просмотреть все доступные систем-
ные модули .NET; прокрутите список вниз
И выберите МОДУЛЬ System.Drawing.dll.
Затем щелкните мышью на кнопке Select.
Чтобы добавить ссылку, следует нажать
кнопку ОК. В результате этого ссылка на
system.Drawing будет включена в файл
shapes.dll. Сохраните изменения, вне-
сенные в исходный файл, закройте iidasm
(в противном случае в процессе компиля-
ции возникнет ошибка, поскольку iidasm
ИСПОЛЬЗует ОТКРЫТЫЙ фаЙЛ s h a p e s . d l l )
и откомпилируйте файл shapes.dll заново
с учетом внесенных в него изменений.
System. Coftf яду? з£!ш. InjtaLc^
5 У « * £ Г Й , O r e e f c o r y S e r v i c e $ , c i
S y s t e m . £ « e » p * & t $ t t v t c &
S y $ t * r t * . f * f e j $ * ^ n t g [ , « S
1 . 0 , 2 4 1 1 , 0
t . o . 2 - m . o
| < & 2 * I S J Q
t J L J M J 1 f )
C : \ w m
C : V A ' i V *
€ ; \ W I W 4
H
: J
. J Jj
Модули .NET 599
После этого повторно запустите iidasm и от-
кройте файл shapes.dll. Теперь вы обнаружите
метод Draw о внутри объекта circle, как показано
на рисунке справа.
Для того чтобы увидеть изменения, внесенные
в MANIFEST, снова два раза щелкните мышью на
указанной строке. Теперь в манифесте содержит-
ся ССЫЛКа на внешний МОДУЛЬ System.Drawing, ЧТО
можно видеть на следующем ниже рисунке.
Модуль shapes информирует систему о том,
что модуль System.Drawing требуется каждый раз,
когда происходит обращение к самому модулю
shapes. Скоро мы перейдем к рассмотрению того,
ЛВс. Ч5Ьадо\ЫпЧ)еЬиДОЬаре&<Я
I > MANIFEST
в--IP Shapes
| \-' •••• f .class public &Ло ami befcf с fid ..-l
- Ш
3 "
„assembly extern n s c o r l ib
5 .puUlickeytoken • <B7 7ft 5C 56 19 2H E6 89 )
\ .чег 1:0:2**11:0
|.assembly extern System.Drawing
•publickeytoken - (BO 3F SF ?F 11 OS 6ft 3ft }
}
:• ,.iss«?»bly Shapes
.oaston instance uoid ^scoi*iib3$ifsteR,Reflection,ftsse?>bXyK<
.coston instance yaid |^scorlib3S^stepj.BefIection.essep>blyK<
*\ . !
„...
// .?.
?^3Refittribute.
>#FiIeftttribute: ,
каким образом другая программа
сможет воспользоваться модулем
shapes, хотя взглянув на экран,
изображенный на рисунке слева,
вы, вероятно, на самом деле начи-
наете недоумевать по поводу того
загадочного содержимого директив
.assembly, которое мы порекомен-
довали временно игнорировать.
Атрибуты модулей
Помимо информации о ссылках на внешние модули в манифесте каждого моду-
ля содержится и другая информация, которая относится непосредственно к самому
модулю. Эта информация называется атрибутами модуля.
Файл Assemblylnfo.cs
Если вы создаете проект библиотеки классов в Visual Studio.NET, то вы, веро-
ятно, обратили внимание на то, что в качестве составной части проекта создается
второй исходный файл на С#. Этот файл называется Assembiyinfo.cs и использу-
ется для задания свойств модуля, хранящихся в манифесте, таких, как номер вер-
сии модуля, имя и т. д. Рассмотрим содержимое этого файла (для экономии места
из него будут удалены некоторые комментарии):
using System.Reflection;
using System.Runtime.CompilerServices; ,
// Общая информация о модуле контролируется посредством
/7 следующего набора атрибутов. Для того чтобы внести
// изменения в информацию, относящуюся к данному модулю,
// необходимо изменить значения этих атрибутов.
//
[assembly: AssemblyTitie{"*)J
[assembly: AssemblyDescription{*")]
[assembly; AssemblyConfiguration("ff)]
[assembly: AssemblyCompany{**)].
[assembly: AssemblyProduct {"*) ]
600 Глава 21
[assembly: AssemblyCopyright("")1 •
[assembly: AssemblyTrademark{"")] ,
. [assembly: AssemblyCulture(я")]
Ш М Ш ш ШШ:: Ш Ш Ш Ш . - ;-.'•: •:; ; '•'•' Ш. Ш Ш . I Ш Ш . Ш Ш ••!:"": '•• Ш •- Ш
II Информация о версии данного модуля состоит из
// следующих четырех значений:
II Major Version (старший номер версии)
II : • Minor Version (младший номер версии)
// Build Number (номер построения)
II Revision (исправление)
: .. -'. ' • р / у . •; !;•" :
:•••••; • ; i :•• ••,.;•;;":
:
: . % : : Ш % > •:.' : % i : 1 ' '' "' '.:'"':'
II У вас есть возможность либо самостоятельно определить
// все значения,' либо использовать для атрибутов Revision
II и Build Numbers значения по умолчанию, для чего следует
//использовать '*', как показано ниже:
[assembly: AssemblyVersion("1.О.*")]
[assembly; AssemblyDelaySign(false)]
[assembly: AssemblyKeyFileC*) 3
[assembly: AssemblyKeyName (*"")] '
Каждый из операторов, заключенных в квадратные скобки и имеющих вид
[assembly: AssembiyXxxxx], представляет собой атрибут, т. е. специальный эле-
мент С#, который более подробно рассматривается в следующей главе. В данный
момент вполне достаточно знать, что каждый из этих операторов задает значение
какого-либо конкретного свойства модуля. Слово assembly:, расположенное в на-
чале каждого атрибута, сообщает системе, что следующая далее директива имеет
отношение к самому модулю, а не к классу, методу или какой-либо другой части
программы.
VS создает этот файл в качестве шаблона, который может быть заполнен
в соответствии со свойствами, которые вы хотите придать модулю. Можно исполь-
зовать эти атрибуты в исходном файле, откомпилированном с помощью директивы
esc. Большая часть атрибутов, среди которых название, компания и т. п., несут
исключительно информационную нагрузку, и им может быть присвоено любое
описательное значение, которое вы захотите поставить в соответствие модулю,
например:
[assembly: AssemblyTitle("MyCompany Shapes Class Library*)]
[assembly: AssemblyDescription("Classes for Manipulation of Shapes")]
[assembly: AssemblyConfiguration("Enterprise Version")]
[assembly: AssemblyCompany("MyCompany, Inc.*)]
[assembly: AssemblyProduct("Shapes")]
[assembly: AssemblyCopyright("Copyright 2001, MyCompany, Inc.")]
[assembly: AssemblyTrademark("Shapes is a trademark of MyCompany, Inc.")]
Атрибут AssembiyCuiture касается национального языка, который используется
для данного модуля, и если таковой задан, то он должен следовать специальным
сокращениям в соответствии с международным стандартом. Более подробную ин-
формацию можно найти в пространстве имен system.Globalization и в темах,
посвященных культуре онлайновой документации .NET Framework. He требуется
задавать этот атрибут до тех пор, пока вы не распространяете версии вашего ком-
понента, работающие на различных языках; если же этот атрибут задан, то систе-
ма выполнения программ .NET начинает автоматически искать версию модуля,
которая соответствует текущему значению, установленному в системе. Например,
во Франции будут выводиться сообщения на французском языке (для чего будут
Модули .NET 601
использоваться ресурсы сообщений и/или код на французском языке), а в Велико-
британии сообщения будут выводиться на английском языке (будут использоваться
ресурсы сообщений и/или код на английском языке). Для того чтобы все происхо-
дило именно таким образом, необходимо пометить конкретный модуль с помощью
соответственного значения атрибута.
Раз эти атрибуты появляются в файле Assembiyinfo.cs, они будут также вклю-
чены в манифест модуля. Если теперь снова взглянуть на манифест shapes.dll, то
МОЖНО Обнаружить Следующую Строку В разделе .assembly Shapes!
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::
.ctor(string) = ( 01 00 00 00 00 )
Эта Строка указывает на ТО, ЧТО В МОДуле Содержится атрибут Assembly Title.
Если файл shapes.cs будет откомпилирован из командной строки без использова-
ния файла Assemblyinfо.cs, то такая строка в манифесте будет отсутствовать.
Номера версий
Номер версии в .NET Framework состоит из четырех частей, как показано ниже:
Major version Minor version Build Number
(старший (младший (номер Revision
номер версии) номер версии) построения) (исправление)
Первые две части номера, скорее всего, знакомы вам как пользователю потре-
бительского программного обеспечения — это старший номер версии и младший
номер версии, как например в shapes версии 1.0 (где 1 — старший номер версии,
а 0 — младший).
Следующие две части номера версии позволяют еще больше его детализиро-
вать. Номер построения обозначает число раз, которое строился данный модуль;
этот номер обычно изменяется каждый раз, когда модуль строится заново.
Номер исправления дает еще один уровень детализации и предназначается для
нумерации "заплаток" или исправленных ошибок в данном модуле, который совер-
шенно ничем не отличается от своего предшественника, кроме как этой единствен-
ной исправленной ошибкой.
Атрибуты версий
В iidasm можно просмотреть атрибуты версии модулей. Взгляните на манифест
файла shapes.dll, и вы увидите, что для всех модулей, на который ссылается
названный манифест, внутри каждого блока .assembly существует директива .ver
для данного модуля.
Информация о номере версии внешних модулей, на которые ссылается данный
модуль, например, на модули system.xxxx и на CLR (mscorlib), имеет одинаковый
вид. Это происходит потому, что система выполнения программ .NET использует
номера версий, хранящиеся в модулях, для проверки совместимости. Мы подробнее
остановимся на этом вопросе, когда перейдем к обсуждению проблемы совмести-
мости версий.
Если вами использовался компилятор командной строки (esc), то в строке с ди-
рективой .ver ДДЯ МОДУЛЯ shapes будут Содержаться ОДНИ Нули:
. v e r 0 : 0 : 0 : 0
602 Глава 21
Это происходит потому, что до сих пор модулю shapes не присвоен никакой но-
мер версии. Если же вы используете Visual Studio.NET, то вы, вероятно, сможете
увидеть приблизительно следующий номер версии:
.ver 1:0:486:7484
благодаря тому, что VS включает информацию о номере версии автоматически.
Атрибут AssemblyVersion
Внутри файла Assemblyinfo.cs, создаваемого VS, номер версии задается по-
средством атрибута AssemblyVersion:
[assembly: AssemblyVersion("1.О.*•)]
Атрибут AssemblyVersion допускает использование символа звездочки (*) для
последних двух частей номера версии. Это означает требование того, чтобы VS
автоматически устанавливал номера построения и исправления. Существует также
возможность использовать звездочку только для номера исправления (как
в l . i . i . * ) , но не для старшего и младшего номеров версии (вариант 1.* является
недопустимым). Если вы посмотрите на номер версии модуля с помощью iidasm,
то увидите, что текущий номер версии, установленный VS, имеет приблизительно
следующий вид:
.ver 1:0:585:24784
Если внести какие-либо изменения в код классов и построить проект заново,
то можно увидеть, что номер версии изменился автоматически и принял приблизи-
тельно следующий вид:
.ver 1:0:585:25005
Можно также непосредственно задать все части номера версии, указав какой-
либо конкретный номер вместо звездочки:
[assembly: AssemblyVersion(*1.0.1.2") ]
Это приведет к созданию VS модуля с данным конкретным номером версии.
Если вы разрабатываете программу для своего собственного использования, то
вам не следует устанавливать номер версии. Однако если вы собираетесь произво-
дить программное обеспечение для других конечных пользователей, то вам потре-
буется изменять старший и младший номера версии по мере того, как вы будете
создавать новые варианты программы с добавлением новых существенных функци-
ональных возможностей: 1.0 для первого выпуска продукта, 1.1 для варианта,
в который внесены менее значительные изменения, 2.0 для более существенных
изменений и т. д. При этом допустимым является возложить обязанность на VS
автоматически определять номера построения/исправления, и в большинство слу-
чаев вам даже не потребуется знать их значения.
Было бы очень удобно использовать iidasm для проверки полного номера вер-
сии. Например, если какой-либо конечный пользователь сообщает об обнаружен-
ной ошибке, то у вас будет возможность сравнить номер версии модуля на своем
компьютере с версией, установленной на компьютере этого пользователя. Вы смо-
жете совершенно точно определить номер версии, с которой работает пользова-
тель; используя номера построения и исправления можно даже отличить построение,
которое вы осуществили сегодня утром, от сделанного вами сегодня перед обедом.
Модули .NET 603
Совместимость версий
Система выполнения программ .NET осуществляет проверку номеров версий
при загрузке модулей с целью определения совместимости версий. Такая проверка
осуществляется только для модулей общего доступа, к рассмотрению которых
мы приступим в настоящей главе позднее. Однако способ, посредством которого
программа проверки номеров версий выполняет свою работу, можно обсудить
прямо сейчас.
В манифесте модуля содержатся номер версии данного модуля и номера версий
внешних модулей, на которые имеются ссылки. Когда система выполнения про-
грамм .NET осуществляет загрузку модуля, на который имеется ссылка, она про-
изводит сличение номера версии, содержащегося в манифесте загружаемого модуля,
с номером версии, указанном в ссылке на этот модуль, для того чтобы убедиться
в совместимости версий.
Если у модулей оказываются различными старшие или младшие номера версий,
они считаются несовместимыми, а модуль, на который указывает ссылка, не будет
загружен — например, программа Shapes версии 1.1 будет несовместима с про-
граммой, которая ссылается на Shapes версий 1.0, 1.2 или 2.0.
Но как быть, если на одном и том же компьютере используются программа А,
работающая с версией Shapes 1.0, и программа В, работающая с версией Shapes 1.1?
Этим вопросом как раз и занимается система выполнения программ .NET.; такая
особенность называется параллельным выполнением (side-by-side execution)
и обеспечивает возможность инсталляции на одном и том же компьютере обеих
версий программы Shapes — 1.0 и 1.1, каждая из которых оказывается доступной
любой ссылающейся на них программе.
Следующие две части номера версии выводят работу с номерами версий на
более тонкий уровень детализации. Номер построения определяет, каким по счету
является построение данной программы; этот номер обычно претерпевает измене-
ния каждый раз, когда модуль строится заново. Два модуля, обладающих одинако-
выми старшими и младшими номерами версии и различными номерами построений,
могут быть (а могут и не быть) совместимыми; система выполнения программ
предполагает, что они являются совместимыми, и допускает их загрузку; задача
вносить изменения в старший и младший номера версии в том случае, если про-
грамма претерпевает изменения, делающие ее несовместимой с предыдущими
версиями, возлагается на разработчика.
Оба Номера версий модулей mscorlib И System.Drawing Соответствовали вер-
сии 1.0 с номером построения 2411 — это номер построения системных модулей
.NET, которые используются на моем компьютере в тот момент, когда я пишу этот
текст. Если какая-либо из этих библиотек будет заменена на новую с номером
построения 2412 или даже 9999, то система выполнения программ .NET будет пы-
таться использовать вновь построенную версию, хотя никаких гарантий ее совмес-
тимости не существует.
Номер исправления представляет собой еще один уровень детализации, позво-
ляя определять некое конкретное изменение или исправление ошибки для данного
номера построения. Предполагается, что версии 1.0.2411.0 и 1.0.2411.1 являются
полностью совместимыми. Для сценария, при котором каждая конкретная про-
грамма выполняется с другой конкретной программой, если два одновременно су-
ществующих модуля обладают совпадающими старшим и младшим номерами версии
и отличаются только номером построения и/или номером исправления, то система
будет пытаться выполнить самый новый модуль (другими словами тот, у которого
номер построения/исправления окажется больше).
604 Глава 21
Вызов модулей
Перейдем к рассмотрению вопроса о том, что происходит, если в какой-либо
программе появляется ссылка на shapes. Мы создадим простого клиента, исполь-
зующего shapes, И назовем его shapeuser.cs:
namespace ShapeUser :
using System; •
using Shapes; -• • .
public class ShapeUser : . :
•{ public s t a t i c void Main()
Circle с = new Circle(1.OF);
Console. WriteLine( "Area of Circle (1.0) i s {0}", c.AreaO);
Компиляция файла shapeuser
с помощью командной строки
Если вы используете компилятор С# из командной строки, то следует создать
файл shapeuser.cs в той же самой директории, в которой располагаются файлы
shapes.cs и shapes.dll, и набрать следующую команду:
esc /reference: shapes.dll shapeuser.es
Это приведет к созданию в текущей директории файла shapeuser.exe, который
будет Ссылаться на ddl. shapes.
Компиляция файла shapeuser с помощью VS
Если вами используется VS, то
создайте новый проект консольного
приложения С именем ShapeUser.
Переименуйте исходный файл под
Именем Classl.cs В shapeuser.es
введите в него программу, приве-
денную выше. Этому проекту при
компиляции потребуется ссылка на
проект shapes, поэтому вам следу-
ет выбрать пункт Add Reference из
меню Project (или щелкните пра-
вой кнопкой мыши на References
в. Solution Explorer и выберите Add
Reference...), в результате чего бу-
дет открыт диалог Add Reference,
представленный на рисунке справа.
Add Reference
COM
ebon System Utaecte 00 ДО S\M 0ROSGFf.NE
cscufrtp?ngd
CustonnM dishatess
frtMemury Соглрйе!
ISynWrapper
JScripi En^he
Microsoft, ОЗШ$ eivices
'' • ' \ uaBasic
Mbrssoa \ i;u:':. Cotap&ih...
r l
0.0.0:0
10,2204,21
0.0.0,0
7.0.0.3030
0,0.0.0
7.a0.9031
1,0.2204.21
1.0Л.О
i.aao
7 П СЛЗП Г)
C:VW1! LN£'
C:VWIMDOWS\M!CRDSOFT,NE"
C : \ W I N D O V / S S M i C R 0 S O F T . N E '
CAWINOOV ^MICROSOFT.NE"
DA'WINDDV/1 ;-• , R O S Q F r i l E " ;
C \ W f N D O V / S ' \ M l C R O S O F T , M E -
C-AWINDOWS\MJCfiOSOFT. N £ *
CAVV1NDO\VS\MICROSOFT N C
CAV/sM .: • ' ^ / ' Г П r,'E' j
Type I Somes
Модули .NET 605
Щелкните мышью на вкладке Projects,
а затем нажмите кнопку Browse (распо-
ложенную справа вверху). В диалоговом
окне Select Components (см. рис. справа)
найдите файл shapes.dll в директории
вашего проекта shapes и щелкните
МЫШЬЮ. КНОПКУ Open. ФаЙЛ shapes.dll
будет включен в список выбранных
компонентов Selected Components.
ЁЬ
Solution 'ShapeUser1 (i project)
|p ShapeUser
B- l References
*m System
*m System,Data
*m Sysfcem.XML
| Assembly Info.cs
| shapeuser.es
I co?>> Projects |
Нажмите кнопку OK — это приведет к тому, что shapes будет до-
бавлен к списку ссылок проекта shapeuser (см. рис. слева).
В результате В Директорию bin\Debug
проекта shapeuser будет добавлена част-
ная копия shapes.dll. Подробнее обсудим
это в следующем разделе, а пока осуще-
ствим Построение приложения ShapeUser.
Исследование проекта
с помощью IfJASM
Теперь, когда shapeuser.exe построен,
можно использовать iidasm для исследо-
вания его содержимого (см. рис. справа).
5te ' P
=3 v shapeuser.exe
is 8—Щ1 ShapeUser
! Sl-'Jf ShapeU$er
h•• • .class pubic auto and beforeflddirA
j—Ш xbr: voidO
»•- Ш M<3in: votd{)
„-„Lei *,!
• J ^
.assembly
.public*
.wer 1:(
-assembly
.ver 1:1
^assetably
.custom
: .CUStOO
extern Rscorlib
c«ptoken • (87 7ft 5C 56 19 3'4 Ев 89 )
1:2411:8
extern Shapes
J:59**: 17 HS 6
ShapeUser
instance uoid {Rscorlib^S^stera.Reflection,*
instance uoid [nscorliblSysten«Reflection.f
J
Ш
Обратите внимание на то, что,
хотя это и автономная программа,
она обладает такими же метадан-
ными, как и у библиотеки классов.
Щелкните два раза мышью на
MANIFEST, и вы увидите в окне,
представленном на рисунке слева,
внешнюю ссылку на компонент
shapes.
Теперь можно вы-
полнить shapeuser.ехе,
в результате чего уви-
дим то, что изображе-
но на рисунке справа.
Йреа
I 4 !
,8egC
o f
s at
:Sharp\Chap
C i r c l e < i
\$ Jkejy8 t o
^PMd;f'V:V $*№»\: У-- :••
.0> is 3.14iS92653589?9
continue
!
606




Категория: информатика | Просмотров: 1634 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz