Кіріспе

Common Language Infrastructure (CLI) тіліндегі ассамблерге балама.

Microsoft компаниясы Windows-тың соңғы нұсқаларында пайдалану үшін анықтаған Common Language Infrastructure (CLI) ассамблері – тарату, нұсқаларды басқару және қауіпсіздік үшін қолданылатын компиляцияланған код кітапханасы. Оның екі түрі бар: процесс ассамблерлері (EXE) және кітапхана ассамблерлері (DLL). Процесс ассамблері кітапхана ассамблерлерінде анықталған сыныптарды пайдаланатын процесс болып табылады. CLI ассамблерлері CIL-де кодты қамтиды, ол әдетте CLI тілінен жасалады, содан кейін орындалу кезінде just-in-time компиляторымен машина тіліне компиляцияланады. .NET Framework іске асырылымында бұл компилятор Common Language Runtime (CLR) құрамына кіреді. Ассамблер бір немесе бірнеше файлдан тұруы мүмкін. Код файлдары модульдер деп аталады. Ассамблер бірнеше код модулін қамтуы мүмкін. Код модульдерін жасау үшін әртүрлі тілдерді пайдалануға болады, сондықтан ассамблерді жасау үшін бірнеше түрлі тілді қолдану техникалық тұрғыдан мүмкін. Дегенмен, Visual Studio бір ассамблерде әртүрлі тілдерді қолдануды қолдамайды.

Құрастыру нұсқалары

CLI құрамалары нұсқа туралы ақпаратты қамти алады, бұл оларға ортақ құрамалардың салдарынан туындаған қосымшалар арасындағы көптеген қақтығыстарды болдырмауға көмектеседі. Дегенмен, бұл құрамалар арасындағы барлық нұсқаулық қақтығыстарды толығымен жоймайды.

Жинақтар мен CLI қауіпсіздігі

CLI кодтық кіру қауіпсіздігі жинақтар мен дәлелдерге негізделеді. Дәлел жинақтан алынған кез келген мәлімет болуы мүмкін, бірақ көбінесе ол жинақтың бастапқы көзінен жасалады – жинақ Интернеттен, интранеттен жүктелген немесе жергілікті машинаға орнатылған (жинақ басқа машинадан жүктелген болса, ол GAC ішіндегі оқшауланған орынға сақталады және демек, жергілікті орнатылған деп есептелмейді). Рұқсаттар бүкіл жинақтарға қолданылады, ал жинақ қажетті ең төменгі рұқсаттарды арнайы атрибуттар арқылы көрсете алады (CLI метадеректеріне қараңыз). Жинақ жүктелген кезде CLR жинаққа қатысты дәлелді пайдаланып, бір немесе бірнеше кодтық кіру рұқсатынан тұратын рұқсаттар жиынтығын құрайды. CLR содан кейін осы рұқсаттар жиынтығында жинақтың талап ететін рұқсаттардың бар екенін тексереді. CLI коды кодтық кіру қауіпсіздігіне қатысты сұрау жасауға болады. Бұл кодтың артық құқықтарды талап ететін әрекеттерді тек шақыру стегіндегі барлық әдістердің барлық жинақтарында көрсетілген рұқсаттар болған жағдайда ғана орындай алатынын білдіреді. Егер бір жинақта рұқсат болмаса, қауіпсіздік қатесі туындайды. CLI коды сондай-ақ шақыру стегінен рұқсат алу үшін байланысты сұрауды орындай алады. Бұл жағдайда CLR шақыру стегіндегі ТОП позициядағы бір әдісті ғана қарастырады. Мұнда стек бойынша іздеу шақыру стегіндегі бір әдіспен шектеледі, соның арқасында CLR CALL STACK-тағы барлық басқа әдістерде де көрсетілген рұқсаттар бар деп есептейді. Жинақ – METADATA және MSIL файлының үйлесімі.

Спутниктер жиынтығы

Жалпы, жиналыстар мәдениетке бейтарап ресурстарды қамтуы керек. Егер сіз жиналымыңызды жергіліктілендіргіңіз келсе (мысалы, әртүрлі тілдер үшін әртүрлі тізбектерді пайдалану), спутниктік жиналыстарды – арнайы, тек ресурстардан тұратын жиналыстарды қолдануыңыз керек. Аты айтқандай, спутник негізгі жиналым деп аталатын жиналыммен байланысты. Бұл жиналым (мысалы, lib.dll) бейтарап ресурстарды қамтиды (Microsoft мұны халықаралық ағылшын тілі дейді, бірақ АҚШ ағылшын тілі деп түсіндіріледі). Әрбір спутниктің аты тиесілі кітапхананың атына ресурстар қосылып жазылады (мысалы, lib.resources.dll). Спутникке бейтарап емес мәдениет атауы беріледі, бірақ бұл қолданыстағы Windows файлдық жүйелерінде (FAT32 және NTFS) ескерілмейтіндіктен, бір папкада бірдей PE атымен бірнеше файл болуы мүмкін. Бұл мүмкін болмағандықтан, спутниктер қосымша папкасының ішіндегі қосалқы папкаларда сақталуы керек. Мысалы, Ұлыбритания ағылшын тіліндегі ресурстарға ие спутниктің CLI аты "lib.resources Version=0.0.0.0 Culture=en-GB PublicKeyToken=null", PE файл аты lib.resources.dll болады және en-GB деп аталатын қосалқы папкада сақталады. Спутниктер System.Resources.ResourceManager деп аталатын CLI класы арқылы жүктеледі. Дамылшы ресурстың атын және негізгі жиналым туралы ақпаратты (бейтарап ресурстармен) беруі керек. ResourceManager класы машинаның тілін анықтайды және осы ақпаратты, сондай-ақ негізгі жиналымның атын спутниктің және оны қамтитын қосалқы папканың атын алу үшін пайдаланады. Содан кейін ResourceManager спутникті жүктей алады және жергіліктілендірілген ресурсты алады.

Анықтамалық құрамалар

C# компиляторының /reference жалаушасын қолдану арқылы орындалатын код кітапханасын сілтемелеуге болады.

Жиналысқа қол қоюды кешіктіру

Ортақ жинақтар қолданбалар арасында ортақ пайдаланылатын жинақты бірегей анықтау үшін күшті атауды беруі керек. Күшті атау ашық кілттік таңбасы, мәдениет, нұсқасы және PE файлының атауынан тұрады. Егер жинақ дамыту мақсатында пайдаланылатын, ортақ жинақ болса, күшті атау процедурасы тек ашық кілтті жасаудан тұрады. Жеке кілт сол уақытта жасалмайды. Ол тек жинақ орнатылғанда ғана жасалады.