Кіріспе

Платформаны шақыру қызметтері, көбінесе P/Invoke деп аталады, Microsoft-тың Common Language Runtime сияқты Common Language Infrastructure іске асырылымдарының мүмкіндігі, ол басқарылатын кодты жергілікті кодты шақыруға мүмкіндік береді. C# немесе VB.NET сияқты басқарылатын код, .NET Framework құрайтын кітапханаларда анықталған кластарға, әдістерге және типтерге тікелей қол жеткізуді қамтамасыз етеді. .NET Framework кең функционалдық жиынтығын ұсынса да, оған әдетте басқарылмаған кодпен жазылған көптеген төменгі деңгейдегі операциялық жүйе кітапханаларына немесе басқарылмаған кодпен жазылған үшінші тарап кітапханаларына қол жеткізу мүмкін болмайды. P/Invoke – бағдарламашының осы кітапханалардағы функцияларды қол жеткізуге пайдаланатын әдісі. Бұл кітапханалардағы функцияларды шақыру басқарылмаған функцияның қолтаңбасын басқарылатын кодта жариялау арқылы жүзеге асырылады, ол басқа басқарылатын әдістер сияқты шақырылатын нақты функция ретінде қызмет етеді. Декларация кітапхананың файлдық жолына сілтеме жасайды және басқарылатын типтердегі функция параметрлерін және қайтарылатын мәнді анықтайды, олар ортақ тілдің орындалу уақыты (CLR) арқылы басқарылмаған типтерге және кері бағытталуы мүмкін. Басқарылмаған дерек типтері басқарылатын типтерге қарапайым жасырын түрлендіру үшін тым күрделі болған жағдайда, фреймворк пайдаланушыға функцияға, қайтарылатын мәнге және/немесе параметрлерге атрибуттарды қоюға мүмкіндік береді, бұл деректерді қалай реттеу керектігін нақты анықтайды, осылайша жасырын түрлендіруге тырысу кезінде туындауы мүмкін қателердің алдын алады. Басқарылмаған тілдерде бағдарламалаумен салыстырғанда басқарылатын кодты бағдарламалаушыларға төменгі деңгейдегі бағдарламалау ұғымдарының көптеген абстракциялары қол жетімді. Осының салдарынан, тек басқарылатын код тәжірибесі бар бағдарламашы P/Invoke пайдаланудағы кейбір қиындықтарды жеңу үшін көрсеткіштер, құрылымдар және сілтеме арқылы беру сияқты бағдарламалау ұғымдарын қайта қарауы керек.

Жағдайсыз

C++/CLI пайдаланып, қолданба басқарылатын үйіндіні (нұсқауларды қадағалау арқылы) және кез келген түпнұсқа жад аймағын, тікелей жариялаусыз бірдей пайдалана алады. (Жасырын) Мұндай жағдайдағы басты артықшылық – түпнұсқа дерек құрылымдары өзгерсе, есімдері сәйкес келген жағдайда, үйлесімсіздік болмайды. Яғни, құрылым мүшелерінің атаулары өзгермесе, түпнұсқа бас файлдағы құрылымдарды қосу/жою/реттеу автоматты түрде қолдауға алынады.

Егжей-тегжейлер

P/Invoke қолданғанда CLR DLL-ді жүктеуді және басқарылмаған типтерді CTS типтеріне түрлендіруді (параметрлерді реттеу деп те аталады) қамтамасыз етеді. Бұл үшін CLR: функцияны қамтитын DLL-ді анықтайды. DLL-ді жадқа жүктейді. Функцияның жадтағы адресін анықтап, оның аргументтерін стекке түсіріп, қажет болған жағдайда деректерді түрлендіреді. P/Invoke стандартты (басқарылмаған) C немесе C++ DLL-дерін пайдалануға ыңғайлы. Бағдарламашы Windows API-ының кең мүмкіндіктеріне қол жеткізуі қажет болғанда, Windows кітапханалары ұсынатын көптеген функциялар үшін қолжетімді орауыштар болмаған жағдайда ол қолданылады. Егер Win32 API .NET Framework-те қолжетімді болмаса, осы API үшін орауышты қолмен жазу қажет.

PInvoke.net сайты

PInvoke.net – көптеген стандартты Windows API-лері үшін P/Invoke қолтаңбаларын қамтитын вики. Ол Redgate Software компаниясына тиесілі және айына шамамен 50000 рет қаралады. Қолтаңбалар вики пайдаланушыларымен қолмен жасалады. Оларды Microsoft Visual Studio-ға арналған тегін қосымша арқылы іздеуге болады.

PInvoker

PInvoker – бұл жергілікті DLL және C++ h файлдарын импорттап, толыққанды құрастырылған P/Invoke үйлесімді DLL-дерін экспорттайтын қосымша. Ол екіұштылық мәселесін PInvoker-ге тән NET интерфейс кластарына жергілікті функциялардың параметрлерін орау арқылы шешеді. P/Invoke әдіс анықтамаларында стандартты NET параметр түрлерін пайдаланудың орнына (, , және т.б.), ол осы интерфейс кластарын P/Invoke функцияларын шақыру кезінде қолданады. Мысалы, жоғарыдағы код мысалын қарастыратын болсақ, PInvoker жергілікті сілтемені орайтын NET интерфейс класын қабылдайтын NET P/Invoke функциясын жасайды. Бұл класс a немесе массивтен құрылуы мүмкін. Екеуінің де нақты жад құрылымы бірдей, бірақ әр типтің тиісті интерфейс класының конструкторлары жадты әртүрлі жолмен толтырады. Сондықтан, функцияға қандай NET типін жіберу керектігін шешу жауапкершілігі әзірлеушіге жүктеледі.

P/Invocate шебері

P/Invoke Wizard Microsoft Interop Assistant-қа ұқсас әдіспен жұмыс істейді, ол C++ h файлдарындағы кодты қабылдап, сіздің NET қолданбаңызға көшіріп жапсыруға болатын C# (немесе VB. NET) кодын жасайды. Бұған қоса, сіз қандай фреймворкке бағытталғыңыз келетінін таңдауға мүмкіндік береді: NET Framework десктоптық қолданбалар үшін немесе NET Compact Framework Windows Mobile смарт құрылғылары (және Windows CE) үшін.

xInterop C++ .NET көпір

xInterop C++ NET Bridge – бұл жергілікті C++ DLL-дері үшін C# wrapper және NET жиналымдарына қол жеткізуге арналған C++ bridge құратын Windows қолданбасы. Ол стандартты C++ кластарын, мысалы string, iostream және т.б. қамтитын C#/.NET кітапханасымен бірге келеді, C++ кластары мен объектілеріне NET-тен қол жеткізуге болады. Бұл құрал қолданыстағы жергілікті C++ DLL-дерінен және құралға C# wrapper DLL-ін құру үшін қажетті бас файлдардан бастапқы кодты қоса C# wrapper DLL-дерін жасайды. P/Invoke қолтаңбалары мен деректерді түрлендіруді қолданба автоматты түрде жасайды. Нәтижесіндегі C# wrapper, параметрлердің түрі NET кодына сәйкес түрленген C++ аналогының ұқсас интерфейсіне ие. Бұл құрал C++ DLL-ден экспортталмаған шаблондық кластарды таниды, шаблондық класты инстанциялайды және оны қосымша DLL-де экспорттайды, ал оған сәйкес C++ интерфейсі NET-те пайдаланылуы мүмкін.