C ++ / CLI рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрдЯрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛


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




рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛


рдкрд░рд┐рдЪрдп
1. C ++ / CLI рдореЗрдВ рдмреЗрд╕рд┐рдХ рдбрд┐рд╕реНрдкреЛрдЬрд▓ рдкреИрдЯрд░реНрди
1.1ред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдлрд╛рдЗрдирд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
1.2ред рд╕реНрдЯреИрдХ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
2. рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕
2.1ред рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕
2.2ред рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
2.3ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк
2.3.1ред рдлрд╛рдЗрдирд▓ рд▓реЙрдХ
2.3.2ред рд╕реЗрдлрд╣реИрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╕рдВрджрд░реНрдн



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


C ++ / CLI - .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ - рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдмрдбрд╝реА рд╕реНрд╡рддрдВрддреНрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рджреЗрд╢реА (рдЕрдкреНрд░рдмрдВрдзрд┐рдд) рдХреЛрдб рдХреЗ рд╕рд╛рде .NET рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓реА рдмрдирд╛рдирд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╡рд░реНрдгрдХ рд╡рд░реНрдЧ рдирд╛рдордХ рдХрдХреНрд╖рд╛рдПрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдкреНрд░рдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рдЬрд┐рдирдХрд╛ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрд╕реЗ рдЙрдЪрд┐рдд рд╕рдордп рдкрд░ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдЫреВрдЯ рджреЗрдирд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ, рдпрд╛рдиреА System::IDisposable рд▓рд╛рдЧреВ рдХрд░рдирд╛ System::IDisposable ред .NET рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдмреЗрд╕рд┐рдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ [Cwalina] рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реА ++ / рд╕реАрдПрд▓рдЖрдИ рдХреА рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдирд┐рдпрдорд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕реА # рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рд╣рд╛рде рд╕реЗ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред



1. C ++ / CLI рдореЗрдВ рдмреЗрд╕рд┐рдХ рдбрд┐рд╕реНрдкреЛрдЬрд▓ рдкреИрдЯрд░реНрди


рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рдореБрдЦреНрдп рддрд░реАрдХреЗ рд╣реИрдВред



1.1ред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдлрд╛рдЗрдирд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рдХреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


 public ref class X {    ~X() {/* ... */} //     !X() {/* ... */} //  // ... }; 

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдВрдХрд▓рдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:


  1. X рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП X System::IDisposable рд▓рд╛рдЧреВ рдХрд░рддрд╛ System::IDisposable ред
  2. X::Dispose() рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЗ GC::SupressFinalize() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ GC::SupressFinalize() рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ GC::SupressFinalize() ред
  3. рдУрд╡рд░рд░рд╛рдЗрдбреНрд╕ System::Object::Finalize() , рдЬрд╣рд╛рдВ рдпрд╣ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдлрд╛рдЗрдирд▓ рдФрд░ рдлрд╛рдЗрдирд▓рд░реНрд╕ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЛ рдПрдХ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЖрдк System::IDisposable рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк X::Dispose() рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред



1.2ред рд╕реНрдЯреИрдХ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдмреЗрд╕рд┐рдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдкреИрдЯрд░реНрди рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдореБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рджрд╕реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреИрдк рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдирд╛рдо (' ^ ') рдХрд╛ рдЙрдкрдпреЛрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ gcnew рд╕рд╛рдеред рд╕реНрдЯреИрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде [рд╣реЛрдЧреЗрдВрд╕рди] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред


рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


 public ref class R : System::IDisposable { public:    R(/*  */); //  // ... }; public ref class X {    R m_R; //   R^ m_R public:    X(/*  */) //         : m_R(/*  */) //   m_R = gcnew R(/*  */)    {/* ... */} // ... }; 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:


  1. X рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП X System::IDisposable рд▓рд╛рдЧреВ рдХрд░рддрд╛ System::IDisposable ред
  2. X::Dispose() m_R рд▓рд┐рдП R::Dispose() рдХреЛ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд░реВрдк рдирд┐рд░реНрдзрд╛рд░рдг рдЗрд╕реА рд╡рд░реНрдЧ R рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣, System::IDisposable рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд System::IDisposable рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк X::Dispose() рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдЕрдиреНрдп рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ Dispose() рдХреЙрд▓ рднреА рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред



2. рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕


рдФрд░ рдЕрдВрдд рдореЗрдВ, C ++ / CLI рдХреА рдПрдХ рдФрд░ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╣рдо рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпреЗ рдХреНрд▓рд╛рд╕рд┐рдХрд▓ C ++ рдХреА рддрд░рд╣ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореВрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ [рд╣реЛрдЧреЗрдВрд╕рди] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред



2.1ред рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕


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


рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкрд╣рд▓рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдПрдХ рдмреЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ, рджреВрд╕рд░рд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВред рдЗрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдореВрд▓) рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд▓реЛрдкрди рд╡рд░реНрдЧ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдЯрд╛рдП рдЧрдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред


 //  , -  , T тАФ   template <typename T> struct DefDeleter {    void operator()(T* p) const { delete p; } }; //  , //      //  , T тАФ  , D тАФ - template <typename T, typename D> public ref class ImplPtrBase : System::IDisposable {    T* m_Ptr;    void Delete()    {        if (m_Ptr != nullptr)        {            D del;            del(m_Ptr);            m_Ptr = nullptr;        }    }    ~ImplPtrBase() { Delete(); }    !ImplPtrBase() { Delete(); } protected:    ImplPtrBase(T* p) : m_Ptr(p) {}    T* Ptr() { return m_Ptr; } }; //        template <typename T, typename D = DefDeleter<T>> public ref class ImplPtr : ImplPtrBase<T, D> { protected:    ImplPtr(T* p) : ImplPtrBase(p) {} public:    property bool IsValid    {        bool get() { return (ImplPtrBase::Ptr() != nullptr); }    } }; //        template <typename T, typename D = DefDeleter<T>> public ref class ImplPtrM sealed : ImplPtrBase<T, D> { public:    ImplPtrM(T* p) : ImplPtrBase(p) {}    operator bool() { return ( ImplPtrBase::Ptr() != nullptr); }    T* operator->() { return ImplPtrBase::Ptr(); }    T* Get() { return ImplPtrBase::Ptr(); } }; 


2.2ред рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 class N //   { public:    N();    ~N();    void DoSomething(); // ... }; using NPtr = ImplPtr<N>; //   public ref class U : NPtr //  - { public:    U() : NPtr(new N()) {}    void DoSomething() { if (IsValid) Ptr()->DoSomething(); } // ... }; public ref class V //  -,   {    ImplPtrM<N> m_NPtr; //   public:    V() : m_NPtr(new N()) {}    void DoSomething() { if (m_NPtr) m_NPtr->DoSomething(); } // ... }; 

рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдХрдХреНрд╖рд╛рдПрдВ U рдФрд░ V рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ; рдЙрдирдХрд╛ Dispose() N рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП delete рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ N ImplPtrM<> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк, рдЖрдкрдХреЛ рдПрдХ рдПрдХрд▓ ImplPtrM<> рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рджреЗрд╢реА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



2.3ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк


рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ .NET рдХрд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкрд╣рд▓реВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рд╕рдВрд╕рд╛рдзрди Dispose() рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП Dispose() ред рд▓реЗрдХрд┐рди рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд╛рдЗрдирд▓рд░реНрд╕ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред



2.3.1ред рдлрд╛рдЗрдирд▓ рд▓реЙрдХ


рдпрджрд┐ рдореВрд▓ рд╡рд░реНрдЧ DLL рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдЬреЛ рд▓реЛрдб рдФрд░ рдЕрдирд▓реЛрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ - LoadLibrary()/FreeLibrary() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рддреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм DLL рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдФрд░ рдЪреВрдВрдХрд┐ рдбреАрдПрд▓рдПрд▓ рдЕрдирд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред (рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрдИ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рд╣реИред) рдЗрд╕рд▓рд┐рдП, DLL рдХреЛ рдЙрддрд╛рд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореВрд▓ ImplPtrBase рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 public ref class DllFlag { protected:    static bool s_Loaded = false; public:    static void SetLoaded(bool loaded) { s_Loaded = loaded; } }; template <typename T, typename D> public ref class ImplPtrBase : DllFlag, System::IDisposable { // ...    !ImplPtrBase() { if (s_Loaded) Delete(); } // ... }; 

DLL рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ DllFlag::SetLoaded(true) , рдФрд░ DllFlag::SetLoaded(false) рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ DllFlag::SetLoaded(false) рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



2.3.2ред SafeHandle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


SafeHandle рдХреНрд▓рд╛рд╕ рдПрдХ рдЬрдЯрд┐рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрдВрддрд┐рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рджреЗрдЦреЗрдВ [рд░рд┐рдХреНрдЯрд░]ред SafeHandle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ImplPtrBase<> рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреБрди: рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢реЗрд╖ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


 using SH = System::Runtime::InteropServices::SafeHandle; using PtrType = System::IntPtr; template <typename T, typename D> public ref class ImplPtrBase : SH { protected:    ImplPtrBase(T* p) : SH(PtrType::Zero, true)    {        handle = PtrType(p);    }    T* Ptr() { return static_cast<T*>(handle.ToPointer()); }    bool ReleaseHandle() override    {        if (!IsInvalid)        {            D del;            del(Ptr());            handle = PtrType::Zero;        }        return true;    } public:    property bool IsInvalid    {        bool get() override        {            return (handle == PtrType::Zero);        }    } }; 


рд╕рдВрджрд░реНрдн


[рд░рд┐рдХреНрдЯрд░]
рд░рд┐рдХреНрдЯрд░, рдЬреЗрдлрд░реАред рдордВрдЪ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ Microsoft .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.5 C # рдореЗрдВред рдЪреМрдерд╛ рд╕рдВрд╕реНрдХрд░рдг: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ: рдкреАрдЯрд░, 2016ред


[Cwalina]
Tsvalina, Krzhishtovред рдЕрдмреНрд░рд╛рдо, рдмреНрд░реИрдбред рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛: рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп .NET рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореНрдореЗрд▓рдиреЛрдВ, рдореБрд╣рд╛рд╡рд░реЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ред: рдЕрдиреБрд╡рд╛рджред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдоред: рдПрд▓рдПрд▓рд╕реА тАЬрдЖрдИ.рдбреА. рд╡рд┐рд▓рд┐рдпрдореНрд╕, 2011ред


[Hogenson]
рд╣реЛрдЧреЗрдВрд╕рди, рдЧреЙрд░реНрдбрдиред C ++ / CLI: .NET рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп C ++ рднрд╛рд╖рд╛ ред: рдкреНрд░рддрд┐ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ - рдПрдоред: рдПрд▓рдПрд▓рд╕реА тАЬрдЖрдИ.рдбреА. рд╡рд┐рд▓рд┐рдпрдореНрд╕, 2007ред



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


All Articles