Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Download 2.46 Mb.
|
Язык программирования C#
16.6. Создание и использование сборок
Все библиотеки и простые приложение в среде .Net являются сборками, поэтому все, что мы создали ранее, было сборками. В этой главе мы явно разнесем небольшое приложение на две части: на библиотеку и на исполняемый модуль. Начнем с написание библиотеки. Для этого создайте новый проект и в правой части окна New Project, отвечающей за выбор нужного шаблона приложения, отметьте Class Library, теперь назовите вашу библиотеку именем HelloLib. Перед вами откроется шаблон новой библиотеки, схожий с шаблоном консольного приложения. Он уже содержит новое пространство имен HelloLib, в этом пространстве имен мы определим класс Hello, содержащий два статических метода SayHello() и SayHelloTo(). using System; namespace HelloLib { public class Hello { public static void SayHello() { Console.WriteLine("Hello!"); } public static void SayHelloTo(string Name) { Console.WriteLine("Hello, " + Name + "!"); } } } Лист. 7.7 Чтобы получить готовую к использованию и распространению .Net библиотеку выберите в меню пункт Build -> Build Solution или нажмите на комбинацию Ctrl + Shift + B. В результате в директории Bin\Debug вашего проекта должна появиться DLL библиотека с именем, совпадающим с именем проекта. В нашем случае это HelloLib. Если вы сейчас попытаетесь запустить проект на выполнение, то получите следующую ошибку, сигнализирующую, что в библиотеки нет точки входа и для её запуска необходимо написать отдельное приложение, вызывающее методы библиотеки. Рис. 7.2 Чтобы посмотреть содержимое сборки и её манифест можно воспользоваться утилитой IL DASM, входящей в комплект поставки Visual Studio. Откройте вашу библиотеку в IL DASM, вы увидите древовидную структуру, как в проводнике Explorer, вторым пунктом сразу после пути к файлу библиотеки находится манифест сборки (Рис. 3), дважды щелкните по нему и вы видите описание манифеста вшей сборки (Рис. 4). Рис. 7.3 Рис. 7.4 Приведем этот манифест в развернутом виде с нашими комментариями. // Версия метаданных: v2.0.50727 // Имя используемой внешней сборки. .assembly extern mscorlib { // Ключ внешней сборки. Он однозначно определяет её глобально. .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. // Используемая версия сборки. .ver 2:0:0:0 } // Имя нашей сборки. .assembly HelloLib { // Далее идут атрибуты методов и конструкторов, определенных в нашей // сборке. .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0.. .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 34 64 32 35 37 37 63 65 2D 38 64 38 37 // ..$4d2577ce-8d87 2D 34 34 30 31 2D 61 34 38 66 2D 33 64 31 30 34 // -4401-a48f-3d104 32 36 65 64 30 31 39 00 00 ) // 26ed019.. .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright .. 20 32 30 30 38 00 00 ) // 2008.. .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 08 48 65 6C 6C 6F 4C 69 62 00 00 ) // ...HelloLib.. .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 08 48 65 6C 6C 6F 4C 69 62 00 00 ) // ...HelloLib.. // --- The following custom attribute is added automatically, do not uncomment ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. // Алгоритм хеширования сборки. Определяет алгоритм по которому // рассчитывался маркер открытого ключа данной сборки. .hash algorithm 0x00008004 // Версия сборки. .ver 1:0:0:0 } // Имя файла сборки. Указывает имя основного модуля данной сборки. .module HelloLib.dll // MVID: {1CF9E9AE-54D5-4C6D-833D-CF8F15434152} .imagebase 0x00400000 // Предпочтительное смещение при загрузки сборки. .file alignment 0x00001000 .stackreserve 0x00100000 // Тип приложения. .subsystem 0x0003 // WINDOWS_CUI // Неиспользуемая, но зарезервированная директива. .corflags 0x00000001 // ILONLY // Image base: 0x03E60000 Лист. 7.8 Как можно увидеть, манифест содержит полную системную информацию о сборке. Эта информация наиболее активно используется при разработке сложных динамически загружаемых приложений - для начального же знакомства дадим краткое предварительное описание содержимого манифеста сборки: 1. В начале манифеста находится секция .assembly extern mscorlib, в которой описываются зависимости от внешних сборок, используемых в данной программе. Здесь для каждой сборки указывается версия и контрольная сумма. Эти данные берутся из сборок при компиляции программы, что гарантирует во время работы приложения использование именно тех сборок, которые использовались при компиляции и тестировании, 2. Далее следует секция .assembly, но уже без модификатора extern. С этой директивы и начинается описание сборки. Как можно заметить, .ver описывает версию сборки, секция .hash algorithm определяет функцию, по которой будет вычисляться хэш-код, затем в манифесте располагаются описания имени самого модуля, подсистемы исполнения, информация о выравнивании секций и еще некоторые данные. Теперь напишем программу, использующую классы, экспортируемые нашей библиотекой. Для этого создайте новое консольной приложение, назовите его UseHelloLiи. Теперь нажмите правой кнопкой мыши на иконку вашего проекта, в открывшимся меню выберите пункт Add Reference, перед вами откроется окно с несколькими в кладками (Рис. 5), прейдите в нем на вкладку Brows, и через нее уже найдите и выберите библиотеку HelloLib. Рис. 7.5 Теперь ваше новое приложение, которое также является сборкой, содержит ссылку на сборку HelloLib. Подключим к нему пространство имен HelloLib и вызовем наши методы SayHello() и SayHelloTo(). using System; using HelloLib; namespace UseHelloLib {
{ static void Main(string[] args) { Hello.SayHello(); Hello.SayHelloTo("tsalik"); } } }
Лист. 7.9 Вывод программы: Hello! Hello, tsalik! Вывод. 7.1 Теперь если вы откроете вашу новую сборку в IL DASM, то увидите, что помимо mscorlib она содержит ссылки на нашу библиотеку HelloLib. Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling