Автор
Галин Илиев
Необходими знания -
Базови познания за .NET Framework и CLR (Common Language Runtime)
-
Базови познания за общата система от типове в .NET (Common Type System – CTS)
-
Познания по езика C#
-
Познаване на инструментите от .NET Framework SDK
-
Базови познания за Windows Installer
Съдържание -
Какво е асембли? Манифест на асембли
-
Конфигурационни файлове
-
Как CLR намира асемблитата?
-
Global Assembly Cache
-
Разпространение и инсталиране на програмни пакети
-
Инсталационни компоненти
-
COM базирани обекти
-
Сървърни компоненти (Serviced Components)
-
Настройки на Internet Information Server (IIS)
-
Промяна на регистрите на Windows
-
Споделени инсталационни компоненти (Merge Modules)
-
CAB файлове
-
Локализиране
-
Debug Symbols
-
Инсталационни стратегии
-
Създаване на MSI инсталационни пакети с VS.NET
В тази тема...
В настоящата тема ще разгледаме най-малката съставна част на .NET приложенията – асемблитата. Ще разгледаме за какво служат, от какво се състоят и как могат да се конфигурират. Ще се спрем на различните техники за разпространение на готовия софтуерен продукт на клиентските работни станции и на някои избрани техники за създаване на инсталационни пакети.
Асемблитата в .NET Framework
Асемблитата са основна съставна част на всеки софтуерен продукт, базиран на .NET Framework. Те са най-малката и основна част при разпространение на .NET приложения. Асемблитата се състоят от компилирани .NET типове (интерфейси, класове, структури и др.), метаданни и ресурси (.bmp, .jpeg, .ico файлове, .resource и .resx ресурси и други). Компилираните типове представляват изпълним програмен код във вид на инструкции на междинния език IL. Метаданните описват асемблитата и типовете в тях. Ресурсите могат да бъдат вградени или записани като външни файлове.
Асемблитата могат да бъдат статични и динамични. Статичните асемблита се съхраняват във файл в portable executable (PE) формат, докато динамичните се изпълняват директно от паметта и не се записват (във файл) преди изпълнението им. .NET Framework предлага стандартни средства и инструменти за създаване на динамични асемблита и позволява тяхното изпълнение и съхранение с помощта на класовете от пространството System.Reflection.Emit.
Асемблитата съдържат IL код за изпълнение
Асемблитата съдържат компилирани .NET типове – програмен код във вид на инструкции на езика Intermediate Language (IL), който се изпълнява от CLR чрез компилация до машиннозависим код. Важно условие за изпълнение на IL кода е наличието на метаданни за асемблито и асембли манифест.
Асемблитата се записват във файлове, които са във формат PE (portable executable). Тези файлове най-често носят разширения .exe или .dll. Всеки преносим изпълним файл (PE файл) може да има входна точка за изпълнение – функция DllMain(…), WinMain(…) или Main(…), съответно за динамични библиотеки, Windows GUI приложения и конзолни приложения. Входната точка може да е най-много една.
Асемблитата формират граница за сигурността (security boundary)
Кодът, който се съдържа в дадено асембли, изисква определени права за достъп и изпълнение. Асемблитата са единица, която може да изисква и получава определени права (permissions). Когато се създава асембли, неговият разработчик може да посочи минимален набор от права, които асемблито задължително изисква, за да работи.
Дали определени права ще се дадат на дадено асембли или не зависи от политиките за сигурност на .NET Framework и т. нар. доказателства, които има асемблито – цифров подпис, силно име (strong name), местоположение (URL, UNC) и др.
Асемблитата формират граница за типовете (type boundary)
Всяко асембли обгръща типовете, които съдържа. Идентичността на типовете е свързана с името на асемблито, в което се намират. Това означава, че типът MyType, деклариран в assembly1.dll, не е еднакъв с типа MyType, деклариран в assembly2.dll. Това позволява по-голяма гъвкавост и независимост на имената при капсулиране на функционалност в асемблитата.
Асемблитата формират граница на видимостта (reference scope boundary)
Манифестът на асемблитата (ще се спрем на него малко по-нататък в настоящата тема) съдържа метаданни, които се използват за намиране на типовете и ресурсите, включени в асемблито. Манифестът определя типовете и ресурсите, които са видими извън границите на асемблито (от други асемблита). В него се описват също и асемблитата, които се изискват, за да се изпълни основното асембли.
Асемблитата формират граница на версиите (version boundary)
Асемблито е най-малката единица, която подлежи на версионизиране в CLR. Всички типове и ресурси в дадено асембли се версионизират заедно като един обект.
В .NET Framework е възможно различни версии на едно и също асембли да съществуват и да се изпълняват едновременно без да си пречат. Това решава много проблеми, предизвикани от конфликти във версиите.
Манифестът описва точно версията на асемблито, както и версиите на асемблитата, които се изискват, за да се изпълни то.
Асемблитата са единица за споделяне
Асемблитата са най-малката единица, която може да бъде споделена между няколко .NET приложения. Основен начин на споделяне е да се даде на асемблито силно име и се постави в GAC (Global Assembly Cache). Друг начин е да се инсталира като частно асембли към дадено приложение. Подробно ще разгледаме тези техники в частта "Разпространение на асемблита".
Асемблитата са единици за разпространение (deployment units)
Асемблитата формират основна програмна единица за разпространение. Когато се стартира едно .NET приложение, са му необходими само асемблитата, които се извикват първоначално. Останалите асемблита (като ресурси за локализация или допълнителни модули) се зареждат при първото им поискване (on demand). Това позволява приложенията да се поддържат малки и удобни при първоначално разпространение. Тази възможност е особено важна при технологията .NET Zero Deployment, която ще опишем по-късно в настоящата тема.
Сподели с приятели: |