P / Invoke рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕реЗ рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛

рд╣рдо рдорд╛рд░реНрд╢рд▓ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рд╣рдо P / Invoke ([DllImport]) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ C # рд╕реЗ C- рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рд╣реИ, рддреЛ [DllImport] рдХреЛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рд▓реЗрдЦ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд╣реИред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╣рдо рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ [рдбреАрдПрд▓рдЖрдИрдПрдордкреЛрд░реНрдЯ]), рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рдпрд╣рд╛рдБ рд╣реИред P / Invoke (C # рдореЗрдВ) рдФрд░ Dll (C) рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди (C рдореЗрдВ) рдФрд░ рдбреЗрд▓рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ (C # рдореЗрдВ) рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╣реИ (рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдП рдФрд░ рдХреИрд╕реЗ рдЖрдП):

NativeCode.h рдлрд╝рд╛рдЗрд▓

/* ,    */ typedef int (__stdcall * pFuncInterface)( __in int nStatus ); typedef struct _Interface { //         pFuncInterface m_pfInterface; //      DWORD m_dwData; } SInterface, *PSInterface; /*    */ __declspec(dllexport) int CreateInterface( __inout PSInterface pInterface ); 


NativeCode.cpp рдлрд╝рд╛рдЗрд▓

 int __stdcall FuncInterface( __in int nStatus) { nStatus = 5; return 1; } /*   */ int CreateInterface( __inout PSInterface pInterface) { //       pInterface->m_pfInterface = FuncInterface; // -  pInterface->m_dwData = 5; return pInterface->m_dwData; } 


рдиреЛрдЯ 1 : рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, __stdcall рдХреЛ рд╕реНрдЯреИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдардХ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЛрдЯ 2 : рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб ( SInterface ) рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ( FuncInterface ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ ( pFuncInterface ) рд╣реИ рдЬреЛ рдПрдХ рдЗрдВрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЗрдВрдЯ , рджреЛ рдлрд╝реАрд▓реНрдб ( SInterface ) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдФрд░ рдлрд╝реАрд▓реНрдб ( CreateInterface ) рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ ред

рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рд╕реА # рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реА рд╕рд╛рдЗрдб рдкрд░ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕реА # рд╕рд╛рдЗрдб рдкрд░ [рдбреЗрд▓рдордкреЛрд░реНрдЯ] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ, рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдЫреЛрдбрд╝реЗрдВ (рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЗрдВ)ред рд▓реЗрдХрд┐рди рдореИрдВ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ)ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдПрдХ Win32 рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ Dll рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ - рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рдмрдирд╛рдПрдЧрд╛ред рд╣рдо Dll рдореЗрдВ рдЕрдкрдиреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рджреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдкреА / рдЗрдирд╡реЛрдХ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди CreateInterface () рдХреЗ рд╕рд╛рде рдПрдХ Dll рд╣реИред

рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╕реА # рддрд░рдл рдЖрдкрдХреЛ рдареАрдХ рдЙрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛), рдЕрд░реНрдерд╛рдд, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕реА # рддрд░рдл, * .h рдлрд╝рд╛рдЗрд▓ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ ( рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, NativeCode.h )ред рдлрд┐рд░ рднреА, CreateInterface () рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде [DllImport], рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 using System; using System.Runtime.InteropServices; namespace SharpCode { /****************************************************/ //    *.h  public delegate int pInterface(int nStatus); [StructLayout(LayoutKind.Sequential, Pack = 1)] struct SInterface { public pInterface m_pfpInterface; public UInt32 m_dwData; } /****************************************************/ class Program { private static SInterface stInterface = new SInterface(); [DllImport("NativeDll", CallingConvention = CallingConvention.Cdecl)] public static extern int CreateInterface( ref SInterface pInterface ); static void Main(string[] args) { CreateInterface(ref stInterface); //         //  unmanaged code   P/Invoke int nRes = stInterface.m_pfpInterface(1); Console.WriteLine("Result = {0}", nRes); } } } 


рдЕрдм рдпрд╣ __stdcall рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдФрд░ рд╡реЙрдЗрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Dll рд╕реЗ CreateInterface () рдХреЙрд▓ рдХрд░рдХреЗ, SInterface рд╕рдВрд░рдЪрдирд╛ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ) рд╕реЗ рднрд░ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ C # рдкрдХреНрд╖ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдк рдкреА / рдЗрдирд╡реЛрдХ рддрдВрддреНрд░ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрдзреЗ рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирддреАрдЬрд╛:

рдЫрд╡рд┐

PS: рдпрд╣ рд╡рд┐рдзрд┐ P / Invoke рдХреЗ рд╕рд╛рде рдЕрдирд╡рд╛рдВрдЯреЗрдб рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

Source: https://habr.com/ru/post/In131209/


All Articles