Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ процСсс Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ интСрСсным, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π·ΠΎΠ²Π° CreateMyAsm() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ динамичСскоС связываниС (см. Π³Π»Π°Π²Ρƒ 12), ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ взаимодСйствиС с Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса HelloWorld.

using System;

using System.Reflection.Emit;

using System.Reflection;

using System.Threading;

…

public class Program {

 static void Main(string[] args) {

  Console.WriteLine("********* ЧудСсный ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ **********");

  Console.WriteLine ("*** динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ***");

  // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

  AppDomain currAppDomain = Thread.GetDomain();

  // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ f(Ρ…).

  Π‘reateMyAsm(currAppDomain);

  Console.WriteLine("-β€Ί Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ создания MyAssembly.dll.");

  // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

  Console.WriteLine("-β€Ί Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° MyAssembly.dll ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.");

  Assembly a = Assembly.Load("MyAssembly");

  // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° HellΠΎWorld.

  Type hello = a.GetType("MyAssembly.HelloWorld");

  // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° HelloWorld ΠΈ Π²Ρ‹Π·ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ конструктора.

  Console.Write("-β€Ί Π’Π²Π΅Π΄ΠΈΡ‚Π΅ сообщСниС для класса HelloWorld: ");

  string msg = Console.ReadLine();

  object[] ctorArgs = new object[1];

  ctorArgs[0] = msg;

  object obj = Activator.CreateInstance(hello, ctorArgs);

  // Π’Ρ‹Π·ΠΎΠ² SayHello ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΉ строки.

  Console.WriteLine("-β€Ί Π’Ρ‹Π·ΠΎΠ² SayHello()");

  Console.WriteLine(" Ρ‡Π΅Ρ€Π΅Π· динамичСскоС связываниС.");

  MethodInfo mi = hello.GetMethod("SayHello");

  mi.Invoke(obj, null);

  // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GetMsg(). ΠœΠ΅Ρ‚ΠΎΠ΄ Invoke() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚,

  // содСрТащий Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

  mi = hello.GetMethod("GetMsg");

  Console.WriteLine(mi.Invoke(obj, null));

 }

}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ создаСтся ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ .NET, способный ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ .NET Π² срСдС выполнСния.

На этом наш ΠΎΠ±Π·ΠΎΡ€ CIL ΠΈ Ρ€ΠΎΠ»ΠΈ динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π― надСюсь, эта Π³Π»Π°Π²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Ρ‹ вашСго понимания систСмы Ρ‚ΠΈΠΏΠΎΠ² .NET, Π° Ρ‚Π°ΠΊΠΆΠ΅ синтаксиса ΠΈ сСмантики CIL.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ свой динамичСски созданный ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π² ildasm.exe, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности пространства ΠΈΠΌΠ΅Π½ System. Reflection.Emit Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ CIL

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ DynAsmBuilder Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 15.

НСсколько слов о System.CodeDOM


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ с Π²Π°ΠΌΠΈ выяснили, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ динамичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ System.Reflection.Emit ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… лСксСм CIL, я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ другая (часто Π±ΠΎΠ»Π΅Π΅ простая) Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°. ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° .NET ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ модСль DOM для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (модСль code DOM), которая позволяСт ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ структуру .NET-Ρ‚ΠΈΠΏΠ° Π² нСзависимых ΠΎΡ‚ языка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π°. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠ² Ρ‚Π°ΠΊΠΎΠΉ Π³Ρ€Π°Ρ„ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‡Π»Π΅Π½ΠΎΠ² пространства ΠΈΠΌΠ΅Π½ System.CodeDOM, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ динамичСски пСрСвСсти Π΅Π³ΠΎ содСрТимоС Π² Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ языку (C#, Visual Basic .NET ΠΈΠ»ΠΈ Π»ΡŽΠ±ΠΎΠΌΡƒ языку стороннСго поставщика, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ code DOM). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, пространство ΠΈΠΌΠ΅Π½ System.CodeDOM.Compiler ΠΈ связанныС с Π½ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для компиляции ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„Π°, находящСгося Π² памяти (ΠΈΠ»ΠΈ сохранСнного) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ статичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ .NET.

К соТалСнию, Π² этой ΠΊΠ½ΠΈΠ³Π΅ Π½Π΅Ρ‚ мСста для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ обсуТдСния Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ code DOM. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поиск ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ "CodeDOM, quick reference" Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ .NET Framework 2.0 SDK.

РСзюмС

Π’ этой Π³Π»Π°Π²Π΅ прСдлагаСтся ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ возмоТностСй синтаксиса ΠΈ сСмантики CIL. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ управляСмых языков Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ уровня, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C#, Π² CIL Π½Π΅ просто опрСдСляСтся Π½Π°Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов, Π½ΠΎ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ (для опрСдСлСния структуры ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠΎΠ²), Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (ΡƒΡ‚ΠΎΡ‡Π½ΡΡŽΡ‰ΠΈΠ΅ характСристики ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹) ΠΈ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ²). Π‘Ρ‹Π» Ρ‚Π°ΠΊΠΆΠ΅ рассмотрСн компилятор CIL (ilasm.exe). Π’Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° .NET, нСпосрСдствСнно измСняя Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ CIL, ΠΈ рассмотрСли основныС этапы, процСсса построСния ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° .NET с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CIL.

Вторая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π³Π»Π°Π²Ρ‹ Π±Ρ‹Π»Π° посвящСна ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ пространства ΠΈΠΌΠ΅Π½ System.Reflection.Emit. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ .NET Π² памяти динамичСски. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ созданный Π² памяти ΠΎΠ±Ρ€Π°Π· Π² физичСском Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС. МногиС Ρ‚ΠΈΠΏΡ‹ System.Reflection.Emit автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ подходящиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ CIL, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ связанныС с Π½ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ConstructorBuilder, TypeBuilder ΠΈ Ρ‚.Π΄. Π’ΠΈΠΏ ILGenerator ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для добавлСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL Π² Ρ‡Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏΠ°. И хотя сущСствуСт Ρ†Π΅Π»Ρ‹ΠΉ ряд Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ·Π²Π°Π½Π½Ρ‹Ρ… ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ процСсс создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΡ€ΠΈ использовании ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL, для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π²Π°ΠΌ понадобится Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ языка CIL.

ЧАБВЬ IV. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ .NET

ГЛАВА 16. ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ System.IO

ΠŸΡ€ΠΈ создании ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сохранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ сСансами доступа ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ этой Π³Π»Π°Π²Π΅ рассматриваСтся Ρ†Π΅Π»Ρ‹ΠΉ ряд вопросов, связанных с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² .NET. ΠŸΠ΅Ρ€Π²ΠΎΠΉ нашСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ исслСдованиС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² пространствС ΠΈΠΌΠ΅Π½ System.IO, ΠΈ выяснСниС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ срСдствами ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ структуру Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ПослС этого ΠΌΡ‹ рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ возмоТности чтСния ΠΈ записи Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² с сим-вольной, Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΈ строковой ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ· памяти.

Анализ пространства ΠΈΠΌΠ΅Π½ System.IO

Π’ .NET пространство ΠΈΠΌΠ΅Π½ System.IO являСтся Ρ‚ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… адрСсов, которая обслуТиваСт слуТбы Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ для Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ для памяти. Подобно Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ пространству ΠΈΠΌΠ΅Π½, System.IO опрСдСляСт свой Π½Π°Π±ΠΎΡ€ классов, интСрфСйсов, ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ΠΉ, структур ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТится Π² mscorlib.dll. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ, содСрТащимся Π² mscorlib.dll, Ρ‡Π°ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½ΠΎΠ² System.IO содСрТится Π² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ System.dll (всС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π² Visual Studio 2005 автоматичСски ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ссылку Π½Π° ΠΎΠ±Π° эти ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠ°, поэтому Π²Π°ΠΌ ΠΎΠ± этом Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ Π½Π΅ приходится).

Π—Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… System.IO), являСтся программная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° физичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Но Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи Π΄Π°Π½Π½Ρ‹Ρ… строковых Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², a Ρ‚Π°ΠΊΠΆΠ΅ нСпосрСдствСнный доступ ΠΊ памяти. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй пространства ΠΈΠΌΠ΅Π½ System.IO, Π² Ρ‚Π°Π±Π». 16.1 описаны Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ (нСабстрактныС) классы.

Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ этим Ρ‚ΠΈΠΏΠ°ΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ созданиС экзСмпляров, Π² System.IO опрСдСляСтся Ρ†Π΅Π»Ρ‹ΠΉ ряд ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π±ΠΎΡ€ абстрактных классов (Stream, TextReader, TextWriter ΠΈ Ρ‚.Π΄.), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΉ интСрфСйс всСм своим ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ классам. Π‘ΠΎΠ»Π΅Π΅ подробная информация ΠΎΠ± этих Ρ‚ΠΈΠΏΠ°Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒΡΡ Π² процСссС дальнСйшСго обсуТдСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° этой Π³Π»Π°Π²Ρ‹.

Π’Π°Π±Π»ΠΈΡ†Π° 16.1. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ пространства ΠΈΠΌΠ΅Π½ System.IO

НСабстрактный Ρ‚ΠΈΠΏ класса Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ОписаниС BinaryReader BinaryWriter ΠŸΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Ρ†Π΅Π»Ρ‹Π΅, логичСскиС, строковыС ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅), ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ значСния BufferedStream ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΠΎΠ·ΠΆΠ΅ Directory DirectoryInfΠΎ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со структурой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π’ΠΈΠΏ Directory ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Π² основном Ρ‡Π΅Ρ€Π΅Π· статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’ΠΈΠΏ DirectoryInfo обСспСчиваСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ возмоТности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подходящСй ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ DriveInfo Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ (появившийся Π² .NET 2.0) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ дисках, установлСнных Π½Π° машинС File FileInfo Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ΠΈΠΏ File ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Π² основном Ρ‡Π΅Ρ€Π΅Π· статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’ΠΈΠΏ FileInfo обСспСчиваСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ возмоТности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подходящСй ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ FileStream ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, поиск), ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ прСдставлСны Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² FileSystemWatcher ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ измСнСния внСшнСго Ρ„Π°ΠΉΠ»Π° MemoryStream ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ прямой доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, сохранСнным Π² памяти, Π° Π½Π΅ Π² физичСском Ρ„Π°ΠΉΠ»Π΅ Path ВыполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ System.String, содСрТащими ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… Π² нСзависимом ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π²ΠΈΠ΄Π΅ StreamWriter StreamReader Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для записи (ΠΈ чтСния) тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΈ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ StringWriter StringReader Подобно Ρ‚ΠΈΠΏΠ°ΠΌ StreamReader/StreamWriter, эти классы Ρ‚ΠΎΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Однако ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС являСтся строковый Π±ΡƒΡ„Π΅Ρ€, Π° Π½Π΅ физичСский Ρ„Π°ΠΉΠ»

Π’ΠΈΠΏΡ‹ Directory(Info) ΠΈ File(Info)