рддреЗрдЬреА рд╕реЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рджреЗрд╢реА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреЙрд▓ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЕрдкреНрд░рд┐рдп рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред
рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
C ++ рдореЗрдВ рдПрдХ dll рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШреЛрд╖рдгрд╛рдПрдБ рд╣реИрдВ:
#pragma pack (push, 4) struct vpsMSR { unsigned __int64 data; unsigned int address; }; #pragma pack (pop) struct vpsConfCounter { int address; int number; vpsMSR *config; unsigned int configCount; }; struct vpsConfig { int processorsCount; vpsConfCounter *counters; unsigned int countersCount; bool printToScreen; std::wstring activityName; }; extern "C" VPS::ErrorCode InitConfig(vpsConfig conf); extern "C" VPS::ErrorCode ClearConfig(vpsConfig conf);
рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред
рд╕рдВрднрд╡ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рд╣реБрдЖред рдЬрдм рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬ рд░рд╣реЗ рдереЗ, рддреЛ рдПрдХ рд╣реЙрд╡реНрдЯреЛ рдорд┐рд▓рд╛ред рдпрд╣ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгреА рдХреЛ рдкрд┐рдШрд▓рд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдЖрдкрдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП "рд╕реЗрд╡рд╛рд░рдд" рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдкрде рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬреАрд╕реА рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рдж рд╕рдВрдХреЗрдд рдЧрд▓рдд рдорд╛рди рд╣реЛрдВрдЧреЗред
рдирд┐рд░реНрдгрдп рд╣реБрдЖ
рдЪреВрдБрдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рдлреА рд╕рдЯреАрдХ рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрд╕реНрдерд╛рдпреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛:
namespace ManagedTemp { #pragma pack (push, 4) struct vpsMSR { unsigned __int64 data; unsigned int address; }; #pragma pack (pop) struct vpsConfCounter { int address; int number; vpsMSR config[10]; unsigned int configCount; }; struct vpsConfig { int processorsCount; vpsConfCounter counters[10]; unsigned int countersCount; bool printToScreen; wchar_t* activityName; }; }
рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдирд┐рд░рдВрддрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рдПрд░рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдорд╛рдПрдБ - рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред
D dll рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдЧрдИрдВ рдЬреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рд╕рд░рдгреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рд▓реЗрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВред
extern "C" VPS::ErrorCode InitConfig2(ManagedTemp::vpsConfig* conf); extern "C" VPS::ErrorCode ClearConfig2(ManagedTemp::vpsConfig* conf);
marshaling
рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:
[StructLayout(LayoutKind.Sequential, Pack = 4)] public struct MSR { [MarshalAs(UnmanagedType.U8)] public System.UInt64 data; public int adress; } [StructLayout(LayoutKind.Sequential)] public struct ConfCounter { public int adress; public int number; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public MSR[] config; [MarshalAs(UnmanagedType.U4)] public uint configCount; } [StructLayout(LayoutKind.Sequential), Serializable] public struct Config { public int processorCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public ConfCounter[] counters; [MarshalAs(UnmanagedType.U4)] public uint countersCount; [MarshalAs(UnmanagedType.Bool)] public bool printToScreen; [MarshalAs(UnmanagedType.LPWStr)] public string activityName; }
рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рддрд░реАрдХреЗ:
[DllImport(@"..\..\IConfigure.dll", EntryPoint = "InitConfig2")] public static extern int InitConfig(ref Config conf); [DllImport(@"..\..\IConfigure.dll", EntryPoint = "ClearConfig2")] public static extern int ClearConfig(ref Config conf);
рдЪреВрдВрдХрд┐ stdcall рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ C ++ dll рдореЗрдВ рд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП CallingConference рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ
рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдПрдХ StackUnbalanced рддреНрд░реБрдЯрд┐ / рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рддреА рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдореБрдЭреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рджреЗрдЦрдирд╛ рдкрдбрд╝рд╛ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдореВрд▓ рдПрдХ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред
рдХрд╛рд░рдг:
1. рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдореИрд╢рд▓рд┐рдВрдЧред
2. рдЕрд▓рдЧ рдмреБрд▓рд╛ рд╕рдореНрдореЗрд▓рдиред
рдирд┐рджрд╛рди рдХреЗ рддрд░реАрдХреЗ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрд▓рд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреА рдЕрдиреБрд░реВрдкрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрдбрд╝рддреА рд╣реИред
__Int64 рдХреЗ рд▓рд┐рдП рдЗрдВрдЯ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛
PInvoke, int64 рд╕реЗ int рдХрд╛рд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ System.Int64 рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдпрд╣ рд╕рд╛рдордЧреНрд░реА UNN рдореЗрдВ ITLab рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдЕрдиреБрднрд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдордПрд╕рдЯреАрдПрди рдкрд░ рд╣реЙрд░реНрд╕ рд▓реЗрдЦ рдФрд░ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред