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
рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП X
System::IDisposable
рд▓рд╛рдЧреВ рдХрд░рддрд╛ System::IDisposable
редX::Dispose()
рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЗ GC::SupressFinalize()
рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ GC::SupressFinalize()
рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ GC::SupressFinalize()
ред- рдУрд╡рд░рд░рд╛рдЗрдбреНрд╕
System::Object::Finalize()
, рдЬрд╣рд╛рдВ рдпрд╣ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдлрд╛рдЗрдирд▓ рдФрд░ рдлрд╛рдЗрдирд▓рд░реНрд╕ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЛ рдПрдХ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЖрдк System::IDisposable
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк X::Dispose()
рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
1.2ред рд╕реНрдЯреИрдХ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдмреЗрд╕рд┐рдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рдкреИрдЯрд░реНрди рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдореБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рджрд╕реНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреИрдк рдХреЗ рдмрд┐рдирд╛ рдЯрд╛рдЗрдк рдирд╛рдо (' ^
') рдХрд╛ рдЙрдкрдпреЛрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ gcnew
рд╕рд╛рдеред рд╕реНрдЯреИрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде [рд╣реЛрдЧреЗрдВрд╕рди] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
public ref class R : System::IDisposable { public: R();
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:
X
рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП X
System::IDisposable
рд▓рд╛рдЧреВ рдХрд░рддрд╛ System::IDisposable
редX::Dispose()
m_R
рд▓рд┐рдП R::Dispose()
рдХреЛ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо рд░реВрдк рдирд┐рд░реНрдзрд╛рд░рдг рдЗрд╕реА рд╡рд░реНрдЧ R
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣, System::IDisposable
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд System::IDisposable
рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк X::Dispose()
рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдЕрдиреНрдп рд╕рджрд╕реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ Dispose()
рдХреЙрд▓ рднреА рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред
2. рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕
рдФрд░ рдЕрдВрдд рдореЗрдВ, C ++ / CLI рдХреА рдПрдХ рдФрд░ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд╣рдо рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпреЗ рдХреНрд▓рд╛рд╕рд┐рдХрд▓ C ++ рдХреА рддрд░рд╣ рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореВрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ [рд╣реЛрдЧреЗрдВрд╕рди] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
2.1ред рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕
рдкреНрд░рдмрдВрдзрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрдкрдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЬреИрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдЕрдВрддрд┐рдо рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдХрд╛рд╕рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдпрд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╕реНрдЯреИрдХ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП), рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкрд╣рд▓рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдПрдХ рдмреЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ, рджреВрд╕рд░рд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВред рдЗрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдореВрд▓) рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд▓реЛрдкрди рд╡рд░реНрдЧ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдЯрд╛рдП рдЧрдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
2.2ред рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
class N // { public: N(); ~N(); void 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 {
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ред