рдУрдлрд┐рд╕рдХреЗрд╢рди рдХреЗ рдмрд╛рдж рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЙрд▓реНрдЯрд╛ (рднрд╛рдЧ 2)

рдкрд░рд┐рдЪрдп


рдпрд╣ рдкреНрд░рдХрд╛рд╢рди рдХреБрдЫ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИред рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЗрд╡рд▓ рд╕реВрдЪрдирд╛ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдмрд╛рдж рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА
рдпрджрд┐ рдПрдХ рд╕рд░реНрдЬрди рдХреЛ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рд╕реНрдХреЗрд▓рдкреЗрд▓ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдХреЗ рдкреНрд░рддрд┐рд╢реЛрдз рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдХ рдЬрд╛рдирдХрд╛рд░ рдХреЛрдбрд░ рд╕реБрдкрд░ рд╡рд╛рдпрд░рд╕ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдкрдирд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред
рддреЛ рдЗрди рдкрд╛рдареЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рджрд░рд╛рд░реЗрдВ рдФрд░ рд╣реИрдХ рдХреЗ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢реЛрдз рд╡рд┐рд╖рдп


рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдПрдЯрдорд╛рдЗрдирд░ рдкреНрд░реЛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди (рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдкреАрдбреА) рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд▓рдЧ-рдЗрди рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЙрдкрдХрд░рдг рдФрд░ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВред рддреЛ, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C ++ рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реИред

class ClassForReadFile { public: ClassForReadFile(); }; 

APD рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ Doxygen рд╢реИрд▓реА рдореЗрдВ рд╣реЛрдВред рд╣рдореЗрдВ рдХрдХреНрд╖рд╛ рдкрд░ рдХрд░реНрд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ CTRL + SHIFT + D рджрдмрд╛рддреЗ рд╣реИрдВ ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 /** The class for read file. */ class ClassForReadFile { public: ClassForReadFile(); }; 

рдкреНрд▓рдЧрдЗрди рдиреЗ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рд╛ред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ! рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЙрд╕рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ

 #ifdef DLL_EXPORTS #define DATA_READER_DLL_EXPORTS __declspec(dllexport) #else #define DATA_READER_DLL_EXPORTS __declspec(dllimport) #endif class DATA_READER_DLL_EXPORTS ClassForReadFile { public: ClassForReadFile(); }; 

C ++ (Windows OS) рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рддрд┐ рдорд╛рдирдХ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред CTRL + SHIFT + D рджрдмрд╛рдПрдВ рдФрд░ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рди рдХрд░реЗрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЙрдореНрдореАрдж рдереА

 /** A data reader DLL exports. */ class DATA_READER_DLL_EXPORTS ClassForReadFile { }; 

DATA_READER_DLL_EXPORTS рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдирд╛рдо рдХреЛ ClassForReadFile рдХреЗ рдмрдЬрд╛рдп рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдФрд░ рдЗрд╕ рдирд╛рдо рд╕реЗ рд╡рд░реНрдЧ рд╡рд┐рд╡рд░рдг рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣реА рд╣реИ, рдкреНрд▓рдЧрдЗрди рдХреЛрдб рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рддрд┐, рдЕрд░реНрдерд╛рддреН, рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд, рдпрд╛ рддреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рд╣рдо рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

рдЪрд░рдг 1


рд╣рдо рд╕реБрд░рд╛рдЧ рддрд▓рд╛рд╢реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪреВрдВрдХрд┐ C / C ++ рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдПрдХ рдорд╛рдирдХ рд╕реНрдерд┐рддрд┐ рд╣реИ, рдлрд┐рд░ рднреА рд╣рдо рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ "рдлреЛрд░реНрд╕" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред DATA_READER_DLL_EXPORTS рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░ , __declspec рдирд┐рд░реНрджреЗрд╢ рд╕реНрд╡рдпрдВ рдбрд╛рд▓реЗрдВ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

 /** The class for read file. */ class __declspec(dllexport) ClassForReadFile { }; 

рдФрд░, рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛, рд╡реЗ рд╕рд╣реА рд╡рд░реНрдЧ рд╡рд░реНрдгрди рдорд┐рд▓рд╛! рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдбреА рдореЗрдВ рдХреБрдЫ рдХреЛрдб рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ "__declspec" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред

рд╣рдо Microsoft SDKs рд╕реЗ рдорд╛рдирдХ ildasm.exe рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рдЗрди "__declspec" рдвреВрдВрдвреЗрдВред рдпрд╣ 2 рд╡рд┐рдзрд┐рдпреЛрдВ CmdDocComment :: a рдФрд░ CmdDocComment :: b рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдПрдХред рд╣рдо рдЗрд╕реЗ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рдЕрдзреАрди рдХрд░реЗрдВрдЧреЗред

рдЪрд░рдг 2


рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЬреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ CmdDocComment :: рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ

рдпрд╣рд╛рдБ __declspec рдорд┐рд▓рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рд╛рдЗрдиреЗрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред

рд╕реНрдЯреНрд░рд┐рдВрдЧ a (CmdDocComment.GeneratorInfo A_0)
 List<string> e = A_0.e; //....... List<string> list = A_0.e; int num3 = 0; while (num3 < list.Count && !(list[num3] == "where") && !(list[num3] == ":")) { if (list[num3] == A_0.b && num2 < 0) { num2 = num3; } if (list[num3] == "__declspec") { if (num3 + 1 < list.Count) { num = list[num3 + 1].IndexOf(')'); if (num >= 0) { list[num3 + 1] = list[num3 + 1].Substring(num + 1).Trim(); } } list.RemoveAt(num3); num3--; } num3++; } if (list.Count > 0 && (list[0] == "struct" || list[0] == "union")) { if (list.Count == 1) { //...... 


рд╣рдордиреЗ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдж
рд╕реВрдЪреА [рд╕рдВрдЦреНрдпрд╛ 3] == "__declspec"
рдбрд┐рд▓реАрдЯ рдореЗрдердб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
list.RemoveAt (num3);
рддрд░реНрдХ рдХрд░рдирд╛ (рдЬрд╝реЛрд░ рд╕реЗ рд╕реЛрдЪрдирд╛):

  1. CmdDocComment :: рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддрд╛рд░ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ

     List<string> list = A_0.e; 
  2. рдЗрд╕ рд╕рд░рдгреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдлрд╝рдВрдХреНрд╢рди, рд╕рдВрд░рдЪрдирд╛, рд╡рд░реНрдЧ, рдЖрджрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХреАрд╡рд░реНрдб "рдХреНрд▓рд╛рд╕", "рд╕реНрдЯреНрд░рдХреНрдЪрд░", "рдпреВрдирд┐рдпрди" рд╣реИред
     list[0] == "struct" 
  3. рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╢рдмреНрдж рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ {"рд╡рд░реНрдЧ", "DATA_READER_DLL_EXPORTS", "ClassForReadFile"} рд╣реЛрдЧрд╛
  4. рдПрдХ рд▓реВрдк рд╣реИ рдЬреЛ рд╕рд░рдгреА "рдИ" рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддрддреНрд╡ "__declspec" рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╣реИ
  5. рдЪрдХреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐ рд╣реИред рдпрд╣ "рдЬрд╣рд╛рдВ" рдпрд╛ ":" рд╢рдмреНрджреЛрдВ рдХрд╛ рд╕реНрдерд╛рди рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╢рдмреНрдж "рдЬрд╣рд╛рдВ", рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛ рд╣реИ, рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди ":" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдПрдХ рдирдпрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

1. рдкрд░рд┐рд╡рд░реНрддрди рдмрд╛рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

2. рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рд╕реВрдЪреА" рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ
- рдкрд╣рд▓рд╛ рддрддреНрд╡ рдЫреЛрдбрд╝реЗрдВ;
- рдЕрдЧрд░ рдЕрдЧрд▓рд╛ рддрддреНрд╡ ":" рдирд╣реАрдВ рд╣реИ рдФрд░ "рдЬрд╣рд╛рдВ" рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рд░рдгреА рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдЯрд╛рдПрдВред

рд╡рд╛рдВрдЫрд┐рдд рдЪрдХреНрд░ рд▓рд┐рдЦрд┐рдП

 //     ,          num2 while (num3 < list.Count && !(list[num3] == "where") && !(list[num3] == ":")) { // ,      .     if (list[num3] == A_0.b && num2 < 0) { num2 = num3; } //  if (list[num3] == "__declspec"),  if (num3 != 0 && num3 < (list.Count - 1) && list[num3 + 1] != ":" && list[num3 + 1] != "where") { e.RemoveAt(index); --index; } num3++; } 

рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред

рдЪрд░рдг 3


рдЬреЛрд░ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдоред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рдВрдХрд▓рди, рд▓рд┐рдВрдХрд┐рдВрдЧ рдХрд╛ рд▓реЗрдЦрди рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдиреЗ рд╣рдореЗрдВ рдРрд╕реЗ рдЕрд╡рд╕рд░ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░ рджрд┐рдпрд╛ред рд╣рдо рдЕрдиреБрд╢рдВрд╕рд┐рдд dnSpy рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо CIL рдХрдорд╛рдВрдб рдХреЗ HEX рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЬреЛ рдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдмрд╣реБрдд рд╣реА рд░реЛрдорд╛рдВрдЪрдХ рдФрд░ рдЬреНрдЮрд╛рдирд╡рд░реНрдзрдХ рд╣реИ! рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред DnSpy рдЦреЛрд▓реЗрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рдХрд░реЗрдВред

рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдЦреЛрдЬреЗрдВ
рдЫрд╡рд┐

рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдФрд░ IL рдореЗрдВ рджреГрд╢реНрдп рдмрджрд▓реЗрдВ
рд╣рдорд╛рд░рд╛ рдЪрдХреНрд░
рдЫрд╡рд┐

рдореИрдВ рдПрдХ рд╕реВрдЪреА рднреА рджреВрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рднрд╛рд░реА рд╣реИ

рд╣рдорд╛рд░рд╛ рдЪрдХреНрд░
 /* 0x00016710 07 */ IL_018C: ldloc.1 //         1. /* 0x00016711 1119 */ IL_018D: ldloc.s V_25 //          ( ). /* 0x00016713 6FF900000A */ IL_018F: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x00016718 72925E0070 */ IL_0194: ldstr "where" //       ,   ,   . /* 0x0001671D 287000000A */ IL_0199: call bool [mscorlib]System.String::op_Equality(string, string) //  ,      . /* 0x00016722 3AAB000000 */ IL_019E: brtrue IL_024E //    ,   value  true,    null   . /* 0x00016727 07 */ IL_01A3: ldloc.1 //         1. /* 0x00016728 1119 */ IL_01A4: ldloc.s V_25 //          ( ). /* 0x0001672A 6FF900000A */ IL_01A6: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x0001672F 72A31D0070 */ IL_01AB: ldstr ":" //       ,   ,   . /* 0x00016734 287000000A */ IL_01B0: call bool [mscorlib]System.String::op_Equality(string, string) //  ,      . /* 0x00016739 3A94000000 */ IL_01B5: brtrue IL_024E //    ,   value  true,    null   . /* 0x0001673E 07 */ IL_01BA: ldloc.1 //         1. /* 0x0001673F 1119 */ IL_01BB: ldloc.s V_25 //          ( ). /* 0x00016741 6FF900000A */ IL_01BD: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x00016746 03 */ IL_01C2: ldarg.1 //     1   . /* 0x00016747 7B12010004 */ IL_01C3: ldfld string Atomineer.Utils.CmdDocComment/GeneratorInfo::b //      ,       . /* 0x0001674C 287000000A */ IL_01C8: call bool [mscorlib]System.String::op_Equality(string, string) //  ,      . /* 0x00016751 2C07 */ IL_01CD: brfalse.s IL_01D6 //    ,   value  false,    . /* 0x00016753 09 */ IL_01CF: ldloc.3 //         3. /* 0x00016754 16 */ IL_01D0: ldc.i4.0 //    0     int32. /* 0x00016755 2F03 */ IL_01D1: bge.s IL_01D6 //     ( ),        . /* 0x00016757 1119 */ IL_01D3: ldloc.s V_25 //          ( ). /* 0x00016759 0D */ IL_01D5: stloc.3 //                3. /* 0x0001675A 07 */ IL_01D6: ldloc.1 //         1. /* 0x0001675B 1119 */ IL_01D7: ldloc.s V_25 //          ( ). /* 0x0001675D 6FF900000A */ IL_01D9: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x00016762 729E5E0070 */ IL_01DE: ldstr "__declspec" //       ,   ,   . /* 0x00016767 287000000A */ IL_01E3: call bool [mscorlib]System.String::op_Equality(string, string) //  ,      . /* 0x0001676C 2C51 */ IL_01E8: brfalse.s IL_023B //    ,   value  false,    . /* 0x0001676E 1119 */ IL_01EA: ldloc.s V_25 //          ( ). /* 0x00016770 17 */ IL_01EC: ldc.i4.1 //    1     int32. /* 0x00016771 58 */ IL_01ED: add //         . /* 0x00016772 07 */ IL_01EE: ldloc.1 //         1. /* 0x00016773 6FF700000A */ IL_01EF: callvirt instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count() //             . /* 0x00016778 2F37 */ IL_01F4: bge.s IL_022D //     ( ),        . /* 0x0001677A 07 */ IL_01F6: ldloc.1 //         1. /* 0x0001677B 1119 */ IL_01F7: ldloc.s V_25 //          ( ). /* 0x0001677D 17 */ IL_01F9: ldc.i4.1 //    1     int32. /* 0x0001677E 58 */ IL_01FA: add //         . /* 0x0001677F 6FF900000A */ IL_01FB: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x00016784 1F29 */ IL_0200: ldc.i4.s 41 //      int8     int32 ( ). /* 0x00016786 6FC800000A */ IL_0202: callvirt instance int32 [mscorlib]System.String::IndexOf(char) //             . /* 0x0001678B 0C */ IL_0207: stloc.2 //                2. /* 0x0001678C 08 */ IL_0208: ldloc.2 //         2. /* 0x0001678D 16 */ IL_0209: ldc.i4.0 //    0     int32. /* 0x0001678E 3221 */ IL_020A: blt.s IL_022D //     ( ),      . /* 0x00016790 07 */ IL_020C: ldloc.1 //         1. /* 0x00016791 1119 */ IL_020D: ldloc.s V_25 //          ( ). /* 0x00016793 17 */ IL_020F: ldc.i4.1 //    1     int32. /* 0x00016794 58 */ IL_0210: add //         . /* 0x00016795 07 */ IL_0211: ldloc.1 //         1. /* 0x00016796 1119 */ IL_0212: ldloc.s V_25 //          ( ). /* 0x00016798 17 */ IL_0214: ldc.i4.1 //    1     int32. /* 0x00016799 58 */ IL_0215: add //         . /* 0x0001679A 6FF900000A */ IL_0216: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32) //             . /* 0x0001679F 08 */ IL_021B: ldloc.2 //         2. /* 0x000167A0 17 */ IL_021C: ldc.i4.1 //    1     int32. /* 0x000167A1 58 */ IL_021D: add //         . /* 0x000167A2 6FCB00000A */ IL_021E: callvirt instance string [mscorlib]System.String::Substring(int32) //             . /* 0x000167A7 6F8600000A */ IL_0223: callvirt instance string [mscorlib]System.String::Trim() //             . /* 0x000167AC 6FFF00000A */ IL_0228: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::set_Item(int32, !0) //             . /* 0x000167B1 07 */ IL_022D: ldloc.1 //         1. /* 0x000167B2 1119 */ IL_022E: ldloc.s V_25 //          ( ). /* 0x000167B4 6F6701000A */ IL_0230: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::RemoveAt(int32) //             . /* 0x000167B9 1119 */ IL_0235: ldloc.s V_25 //          ( ). /* 0x000167BB 17 */ IL_0237: ldc.i4.1 //    1     int32. /* 0x000167BC 59 */ IL_0238: sub //           . /* 0x000167BD 1319 */ IL_0239: stloc.s V_25 //                index ( ). /* 0x000167BF 1119 */ IL_023B: ldloc.s V_25 //          ( ). /* 0x000167C1 17 */ IL_023D: ldc.i4.1 //    1     int32. /* 0x000167C2 58 */ IL_023E: add //         . /* 0x000167C3 1319 */ IL_023F: stloc.s V_25 //                index ( ). /* 0x000167C5 1119 */ IL_0241: ldloc.s V_25 //          ( ). /* 0x000167C7 07 */ IL_0243: ldloc.1 //         1. /* 0x000167C8 6FF700000A */ IL_0244: callvirt instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count() //             . /* 0x000167CD 3F3EFFFFFF */ IL_0249: blt IL_018C //    ,     . 


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CIL рдХрдорд╛рдВрдб рдореЗрдВ рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реИ, рдЙрдирдХрд╛ HEX рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдлрд╝рд╛рдЗрд▓ рдСрдлрд╝рд╕реЗрдЯ рдФрд░ рд╡рд┐рд╡рд░рдгред рд╕рднреА рдПрдХ рдЬрдЧрд╣ рдкрд░ред рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ (рдзрдиреНрдпрд╡рд╛рдж CrazyAlex25 )ред
рдЪрд▓реЛ "__declspec" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реБрдП рдмреНрд▓реЙрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдмреНрд▓реЙрдХ рдСрдлрд╕реЗрдЯ 0x0001675Aред рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рдВрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдмрд╛рдж, RemoveAt рд╡рд┐рдзрд┐ рдЦреЛрдЬреЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ред рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ 0x000167BF рд╣реИред HEX рдХреЗ рд╕рдВрдкрд╛рджрдХ Ctrl + X рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ 0x00 рд▓рд┐рдЦреЗрдВред рд╣рдо рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рдФрд░ рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИред
рдЦрд╛рд▓реА рд▓реВрдк
 while (num3 < list.Count && !(list[num3] == "where") && !(list[num3] == ":")) { if (list[num3] == A_0.b && num2 < 0) { num2 = num3; } list.RemoveAt(num3); num3--; num3++; } 


рдЕрдм рд╣рдо рдирдП рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢рд░реНрдд рдЬреЛрдбрд╝реЗрдВ

  if (num3 != 0 && num3 < list.Count - 1) 

рддрд╛рд▓рд┐рдХрд╛ рдирдП рдЖрджреЗрд╢реЛрдВ рдФрд░ рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИред
1119ldloc.sрдЧрдгрдирд╛ рд╕реНрдЯреИрдХ (рд▓рдШреБ рд░реВрдк) рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
2C61brfalse.sрдЕрдВрддрд┐рдо рдХрдерди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдорд╛рди рдЧрд▓рдд рд╣реИ, рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдпрд╛ рд╢реВрдиреНрдп рд╣реИред рдиреЛрдЯ : рдпрджрд┐ рдЕрдВрдХ 3 == 0 рд╣реИ, рддреЛ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред рдорд╛рди 0x64, рдирд┐рд░реНрджреЗрд╢ 0x000167BF рдкрд░ рдкрддрд╛ рдСрдлрд╝рд╕реЗрдЯ рд╣реИ (рд╕реВрдЪреА рджреЗрдЦреЗрдВ)
1119ldloc.sрдЧрдгрдирд╛ рд╕реНрдЯреИрдХ (рд▓рдШреБ рд░реВрдк) рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ
07ldloc.1рдЧрдгрдирд╛ рд╕реНрдЯреИрдХ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ 1 рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ
6FF700000Acallvirtget_Count () - рдПрдХ рд▓реЗрдЯ-рдмрд╛рдЙрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдкреБрд╢ рдХрд░рддрд╛ рд╣реИ
17ldc.i4.1рдЗрдВрдЯреНрдпреВ 3 рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рд╕реНрдЯреИрдХ рдкрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди 1 рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ
59рдЙрдкрдПрдХ рдорд╛рди рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рд╕реНрдЯреИрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИред
2F55bge.sрдпрд╣ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ (рд▓рдШреБ рд░реВрдк) рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рджреВрд╕рд░реЗ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдиреЛрдЯ : рдпрджрд┐ num3> list.Count - 1 рд╣реИ, рддреЛ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред рдорд╛рди 0x55 рдирд┐рд░реНрджреЗрд╢ 0x000167BF рд╕реЗ рдкрд╣рд▓реЗ рдкрддрд╛ рдСрдлрд╕реЗрдЯ рд╣реИ

рд╣рдо рдСрдлрд╕реЗрдЯ 0x0001675A рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЗрди рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд

рдкрд╣рд▓реА рд╢рд░реНрдд
 while (num3 < list.Count && !(list[num3] == "where") && !(list[num3] == ":")) { if (list[num3] == A_0.b && num2 < 0) { num2 = num3; } //     if (num3 != 0 && num3 < list.Count - 1) { list.RemoveAt(num3); num3--; } num3++; } 


рдЕрдм рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪреЗрдХ рдХреЛ "рдЬрд╣рд╛рдВ" рдФрд░ ":" рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдореИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд HEX рдХреЛрдб рдЙрджреНрдзреГрдд рдХрд░рддрд╛ рд╣реВрдВ:

 07 11 19 17 58 6F F9 00 00 0A 72 A3 1D 00 70 28 70 00 00 0A 2D 3F 07 11 19 17 58 6F F9 00 00 0A 72 92 5E 00 70 28 70 00 00 0A 2D 29 

рд╡рд┐рдШрдЯрд┐рдд рдФрд░ рдЬреЛ рдЖрдкрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдирдпрд╛ рдЪрдХреНрд░
 while (num3 < list.Count && !(list[num3] == "where") && !(list[num3] == ":")) { if (list[num3] == A_0.b && num2 < 0) { num2 = num3; } if (num3 != 0 && num3 < list.Count - 1 && !(list[num3 + 1] == ":") && !(list[num3 + 1] == "where")) { list.RemoveAt(num3); num3--; } num3++; } 


рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд▓рдЧрдЗрди рдХреЛрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:

 /** The class for read file. */ class DATA_READER_DLL_EXPORTS ClassForReadFile { }; 

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдмреЗрд╢рдХ, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдЪрд╛рд░ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ "рдкреНрд░рддрд┐рдмрдВрдз рджрд░рд╛рд░" рдирд╣реАрдВ рд╣реИред рд╣рдордиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдмрдЧ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ред

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


All Articles