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

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

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

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ строка, содСрТащая Ρ‚ΠΈΠΏ ΠΈ имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², строится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° foreach.

public static void ListMethods(Type t) {

 Console.WriteLine(***** ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ *****");

 MethodInfo[] mi = t.GetMethods();

 foreach (MethodInfo m in mi) {

  // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

  string retVal = m.ReturnType.FullName;

  string paramInfo = "(";

  // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

  foreach (ParameterInfo pi in m.GetParameters()) {

   paramInfo += string.Format("{0} {1}", pi.ParameterType, pi.Name);

  }

  paramInfo += ")";

  // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ основных характСристик ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

  Console.WriteLine("-β€Ί{0} {1} (2}", retVal, m.Name, paramInfo);

 }

 Console.WriteLine(");

}

Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ это ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄ΡƒΡ‚ описаны Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° рис. 12.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ‚ΠΈΠΏΠ° System.Globalization.GregorianCalendar.

Рис. 12.3. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² System.Globalization.GregorianCalendar

Π’Π΅ΡΡŒΠΌΠ° ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? Ясно, Ρ‡Ρ‚ΠΎ пространство ΠΈΠΌΠ΅Π½ System.Reflection ΠΈ класс System.Type ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ характСристики Ρ‚ΠΈΠΏΠ°, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² MyTypeViewer. Π’Ρ‹ Π²ΠΏΡ€Π°Π²Π΅ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ события Ρ‚ΠΈΠΏΠ°, Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ интСрфСйсы Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ явно, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… характСристик.

Но ΠΈ Π² Π½Ρ‹Π½Π΅ΡˆΠ½Π΅ΠΌ своСм Π²ΠΈΠ΄Π΅ ваш ΠΎΠ±ΠΎΠ·Ρ€Π΅Π²Π°Ρ‚Π΅Π»ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡƒΠΆΠ΅ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚. Π“Π»Π°Π²Π½Ρ‹ΠΌ Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π²Π½Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (MyTypeViewer) ΠΈΠ»ΠΈ всСгда доступного mscorlib.dll. Π’ связи с этим остаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ вопрос: "Как ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ (ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ) ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²ΠΎ врСмя компиляции?"

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

ДинамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ

Из ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Ρ‹ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ срСда CLR ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ манифСста ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΈ Π·ΠΎΠ½Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΏΠΎ внСшним ссылкам. ВсС это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ "Π½Π° Π»Π΅Ρ‚Ρƒ" Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ срСдствами, Π° записСй ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ Π² манифСстС Π½Π΅Ρ‚. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΏΠΎ запросу называСтся динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… System.Reflection опрСдСляСтся класс, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Assembly. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот Ρ‚ΠΈΠΏ, ΠΌΠΎΠΆΠ½ΠΎ динамичСски Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ любой ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ свойства. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΈΠΏ Assembly, ΠΌΠΎΠΆΠ½ΠΎ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ ΠΈ общСдоступныС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π² любом мСстС систСмы. Класс Assembly ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Π² частности, Load() ΠΈ LoadFrom()), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ срСдствами ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ‚ΠΎΠΉ, которая содСрТится Π² Ρ„Π°ΠΉΠ»Π΅ *.config ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ создайтС Π½ΠΎΠ²ΠΎΠ΅ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ExternalAssemblyReflector. Π’Π°ΡˆΠ΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ являСтся построСниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main(), Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ понятноС имя ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° для динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Бсылка Assembly Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ DisplayTypes(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° всСх, классов, интСрфСйсов, структур, ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ΠΉ ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. НСобходимый ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ выглядит довольно просто.

using System;

using System.Reflection;

using System.IO; // Для опрСдСлСния FileNotFoundException.

namespace ExternalAssemblyReflector {

 class Program {

  static void DisplayTypesInAsm(Assembly asm) {

   Console.WriteLine("\n*** Π’ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ***");

   Console.WriteLine("-β€Ί {0}", asm.FullName);

   Type[] types = asm.GetTypes();

   foreach (Type t in types) Console.WriteLine("Π’ΠΈΠΏ: {0}", t);

   Console.WriteLine(");

  }

  static void Main(string[] args) {

   Console.WriteLine("*** ΠžΠ±Π·ΠΎΡ€ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ***");

   string asmName = ";

   bool userIsDone = false;

   Assembly asm = null;

   do {

    Console.WriteLine("\nΠ’Π²Π΅Π΄ΠΈΡ‚Π΅ имя ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°");

    Console.Write("ΠΈΠ»ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Q для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· прилоТСния:");

    // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

    asmName = Console.ReadLine();

    // Π–Π΅Π»Π°Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния?

    if (asmName.ToUpper() == "Q") {

     userIsDone = true;

     break;

    }

    // ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

    try {

     asm = Assembly.Load(asmName);

     DisplayTypesInAsm(asm);

    } catch {

     Console.WriteLine("Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.");

    }

   } while (userIsDone);

  }

 }

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ статичСскому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Assembly.Load() пСрСдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ понятноС имя ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ CarLibrary.dll с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» CarLibrary.dll Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ \Bin\Debug прилоТСния ExternalAssemblyReflector. ПослС этого Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π½Π° рис. 12.4.

Рис. 12.4. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ внСшнСго ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° CarLibrary

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ExternalAssemblyReflector Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, слСдуСт Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ внСшний ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Assembsly.LoadFrom(), Π° Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Assembly.Load(). Π’ΠΎΠ³Π΄Π° Π²Ρ‹ смоТСтС ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C:\MyApp\MyAsm.dll).

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

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ общСдоступных ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ, ΠΌΠ΅Ρ‚ΠΎΠ΄ Assembly.Load() являСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ. Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Assembly.Load() позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° culture (для Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½ΠΎΠΌΠ΅Ρ€ вСрсии ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° (для общСдоступных ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²).

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

Name (,Culture = ΠΊΠΎΠ΄_языка) (,Version = _Π³Π»Π°Π²Π½Ρ‹ΠΉ_Π½ΠΎΠΌΠ΅Ρ€.Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ_Π½ΠΎΠΌΠ΅Ρ€.Π½ΠΎΠΌΠ΅Ρ€_ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.Π½ΠΎΠΌep_Π²apΠΈaΠ½Ρ‚a) (,PublicKeyToken= ΠΊΠΎΠ΄_ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ_ΠΊΠ»ΡŽΡ‡Π°)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PublicKeyToken = null Π² строкС, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ дисплСйноС имя, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ связывании ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° строгого ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ трСбуСтся ΠΈ Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Culture = "" сообщаСт ΠΎ нСобходимости использований значСния ΠΊΠΎΠ΄Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, принятого Π½Π° машинС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

// Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° CarLibrary вСрсии 1.0.982.23972 с ΠΊΠΎΠ΄ΠΎΠΌ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ,

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Assembly a = Assembly.Load(@"CarLibrary,Version=1.0.982.23972,PublicKeyToken=null,Culture=''");

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ System.Reflection ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΈΠΏ AssemblyName, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ строку Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этот класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСстС с System.Version, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ для Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Π‘ΠΎΠ·Π΄Π°Π² дисплСйноС имя, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Assembly.Load().

// ИспользованиС AssemblyName для опрСдСлСния дисплСйного ΠΈΠΌΠ΅Π½ΠΈ.

AssemblyName asmName;

asmName = new AssemblyName();

asmName.Name = "CarLibrary";

Version v = new Version("1.0.982.23972");

asmName.Version = v;

Assembly a = Assembly.Load(asmName);

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ общСдоступный ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈΠ· GAC, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Assembly.Load() Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ publickeytoken. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°-ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ System.Windows.Forms.dll вСрсии 2.0.0.0, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов .NET. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ число Ρ‚ΠΈΠΏΠΎΠ² Π² этом ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 20 Ρ‚ΠΈΠΏΠΎΠ².

using System;

using System.Reflection;

using System.IO;

namespace SharedAsmReflector {

  public class SharedAsmReflector {

   private static void DisplayInfo(Assembly a) {

    Console.WriteLine("***** Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ *****");

    Console.WriteLine("Π—Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΈΠ· GAC? {0}", a.GlobalAssemblyCache);

    Console.WriteLine("Имя: {0}", a.GetName().Name);