Csharp/C Sharp/Reflection/Assembly

Материал из .Net Framework эксперт
Версия от 14:38, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

AssemblyCulture AssemblyVersion

<source lang="csharp"> using System; using System.Reflection; [assembly:AssemblyCulture("")] [assembly:AssemblyVersion("1.1.0.5")] namespace MainClass {

   class MainClass
   {
       public static void Main()
       {
           Console.WriteLine("\nMain method complete. Press Enter.");
       }
   }

}

</source>


AssemblyName: Name, Version, CultureInfo, SetPublicKeyToken

<source lang="csharp"> using System; using System.Reflection; using System.Globalization;

   class MainClass
   {
       public static void ListAssemblies()
       {
           Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
           foreach (Assembly a in assemblies)
           {
               Console.WriteLine(a.GetName());
           }
       }
       public static void Main()
       {
           ListAssemblies();
           string name1 = "System.Data, Version=2.0.0.0," +"Culture=neutral, PublicKeyToken=b77a5c561934e089";
           Assembly a1 = Assembly.Load(name1);
           AssemblyName name2 = new AssemblyName();
           name2.Name = "System.Xml";
           name2.Version = new Version(2, 0, 0, 0);
           name2.CultureInfo = new CultureInfo("");    //Neutral culture.
           name2.SetPublicKeyToken(new byte[] {0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89});
           Assembly a2 = Assembly.Load(name2);
           Assembly a3 = Assembly.Load("SomeAssembly");
           Assembly a4 = Assembly.LoadFrom(@"c:\shared\MySharedAssembly.dll");
           Console.WriteLine("\n\n**** AFTER ****");
           ListAssemblies();
       }
   }
</source>


Create assembly

<source lang="csharp"> using System; using System.Reflection; using System.Reflection.Emit; class CodeGenerator {

   Type t;
   public static void Main() {
      CodeGenerator codeGen = new CodeGenerator();
      Type t = codeGen.T;
      if (t != null) {
         object o = Activator.CreateInstance(t);
         MethodInfo helloWorld = t.GetMethod("HelloWorld");
         if (helloWorld != null) {
            // Run the HelloWorld Method
            helloWorld.Invoke(o, null);
         } else {
            Console.WriteLine("Could not retrieve MethodInfo");
         }
      } else {
            Console.WriteLine("Could not access the Type");
      }
   } 
   public CodeGenerator() {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      AssemblyName assemName = new AssemblyName();
      assemName.Name = "MyAssembly";
      AssemblyBuilder assemBuilder = currentDomain.DefineDynamicAssembly(assemName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemBuilder.DefineDynamicModule("MyModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyClass",TypeAttributes.Public);
      MethodBuilder methodBuilder = typeBuilder.DefineMethod("HelloWorld", MethodAttributes.Public,null,null);
      ILGenerator msilG = methodBuilder.GetILGenerator();
      msilG.EmitWriteLine("www.nfex.ru");
      msilG.Emit(OpCodes.Ret);
      t = typeBuilder.CreateType();
  }
  public Type T {
      get { 
        return this.t;
      }
  }

}


      </source>


CurrentDomain, GetAssemblies

<source lang="csharp">

using System; using System.Reflection; using System.Globalization; class MainClass {

   public static void Main()
   {
       ListAssemblies();
       string name1 = "System.Data, Version=2.0.0.0," +"Culture=neutral, PublicKeyToken=b77a5c561934e089";
       Assembly a1 = Assembly.Load(name1);
       AssemblyName name2 = new AssemblyName();
       name2.Name = "System.Xml";
       name2.Version = new Version(2, 0, 0, 0);
       name2.CultureInfo = new CultureInfo("");    //Neutral culture.
       name2.SetPublicKeyToken(new byte[] {0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89});
       Assembly a2 = Assembly.Load(name2);
       Assembly a3 = Assembly.Load("SomeAssembly");
       Assembly a4 = Assembly.LoadFrom(@"c:\shared\MySharedAssembly.dll");
       Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
       foreach (Assembly a in assemblies)
       {
           Console.WriteLine(a.GetName());
       }
   }

}

</source>


Dynamically invoking methods from classes in an assembly.

<source lang="csharp">

using System; using System.Reflection; interface IMyInterface {

   void PrintAString(string s);
   void PrintAnInteger(int i);
   void PrintSomeNumbers(string desc, int i, double d);
   int GetANumber(string s);

} public class MyClass : IMyInterface {

   public MyClass() {
   }
   public void PrintAString(string s) {
       Console.WriteLine("PrintAString: {0}", s);
   }
   public void PrintAnInteger(int i) {
       Console.WriteLine("PrintAnInteger: {0}", i);
   }
   public void PrintSomeNumbers(string desc, int i, double d) {
       Console.WriteLine("PrintSomeNumbers String: {0}", desc);
       Console.WriteLine("Integer: {0}", i);
       Console.WriteLine("Double: {0}", d);
   }
   public int GetANumber(string s) {
       Console.WriteLine("GetANumber: {0}", s);
       return 99;
   }
   public int DoItAll(string s, int i, double d) {
       IMyInterface mi = (IMyInterface)this;
       mi.PrintSomeNumbers(s, i, d);
       return mi.GetANumber(s);
   }

} public class MainClass {

   public static void DoDynamicInvocation(string assembly) {
       Assembly a = Assembly.LoadFrom(assembly);
       foreach (Type t in a.GetTypes()) {
           if (t.IsClass == false)
               continue;
           if (t.GetInterface("IMyInterface") == null)
               continue;
           Console.WriteLine("Creating instance of class {0}", t.FullName);
           object obj = Activator.CreateInstance(t);
           object[] args = { "Dynamic", 1, 99.6 };
           object result;
           result = t.InvokeMember("DoItAll",BindingFlags.Default|BindingFlags.InvokeMethod,null,obj,args);
           Console.WriteLine("Result of dynamic call: {0}", result);
           object[] args2 = { 12 };
           t.InvokeMember("PrintAnInteger",BindingFlags.Default | BindingFlags.InvokeMethod,null,obj,args2);
       }
   }
   public static void Main(string[] args) {
       MyClass dmi = new MyClass();
       dmi.PrintSomeNumbers("PrintMe", 1, 1.9);
       int i = dmi.GetANumber("GiveMeOne");
       Console.WriteLine("I = {0}", i);
       DoDynamicInvocation(args[0]);
   }

}

</source>


Examining Location Information

<source lang="csharp"> using System; using System.Reflection;

public class MainClass {

   static void Main()
   {
       Assembly EntryAssembly;
  
       EntryAssembly = Assembly.GetEntryAssembly();
       Console.WriteLine("Location: {0}", EntryAssembly.Location);
       Console.WriteLine("Code Base: {0}", EntryAssembly.CodeBase);
       Console.WriteLine("Escaped Code Base: {0}", EntryAssembly.EscapedCodeBase);
       Console.WriteLine("Loaded from GAC: {0}", EntryAssembly.GlobalAssemblyCache);
   }

}

      </source>


Find Attribytes from assembly name

<source lang="csharp"> using System; using System.Reflection; public class FindAttributes {

 static void Main(string[] args) {
     String assemblyName = "test.exe" ;
     try
     {
       Assembly  a = Assembly.LoadFrom ( assemblyName ) ;
       object[]  attributes = a.GetCustomAttributes( true ) ;
       if ( attributes.Length > 0 ) {
         Console.WriteLine ( "Assembly attributes for "{0}"..." , assemblyName ) ;
         foreach ( object o in attributes )
           Console.WriteLine ( "  {0}" , o.ToString ( ) ) ;
       }
       else{
         Console.WriteLine ( "Assembly {0} contains no Attributes." , assemblyName ) ;
       } 
     } catch ( Exception ex ) {
       Console.WriteLine ( ex.ToString ( ) ) ;
     }
 }

}

      </source>


Finding and Creating Assembly Types

<source lang="csharp"> using System; using System.Reflection;

public class MainClass {

   static void Main(string[] args)
   {
       Assembly XMLAssembly;
       Type[] XMLTypes;
  
       XMLAssembly = Assembly.Load("System.Xml, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
       XMLTypes = XMLAssembly.GetExportedTypes();
       foreach(Type XMLType in XMLTypes) {
           object NewObject;
           try {
               Console.Write(XMLType.ToString());
               NewObject = XMLAssembly.CreateInstance(XMLType.ToString());
               if(NewObject != null)
                   Console.WriteLine(" - Creation successful");
               else
                   Console.WriteLine(" - CREATION ERROR");
           } catch(Exception e) {
               Console.WriteLine(" - EXCEPTION: {0}", e.Message);
           }
       }
   }

}

      </source>


Get current application domain

<source lang="csharp">

   using System;
 using System.Reflection;
 using System.Windows.Forms;
   public class MyAppDomain
   {
       public static void Main(string[] args)
       {
     AppDomain ad = AppDomain.CurrentDomain;
     Assembly[] loadedAssemblies = ad.GetAssemblies();
     
     Console.WriteLine("Here are the assemblies loaded in this appdomain\n");
     foreach(Assembly a in loadedAssemblies)
     {
       Console.WriteLine(a.FullName);
     }
       }
   }


      </source>


GetReferencedAssemblies

<source lang="csharp"> using System; using System.Reflection; public class MainClass {

   static void Main()
   {
   Assembly EntryAssembly;
   EntryAssembly = Assembly.GetEntryAssembly();
   foreach(AssemblyName Name in EntryAssembly.GetReferencedAssemblies())
     Console.WriteLine("Name: {0}", Name.ToString());
   }

}

</source>


List All Members from an Assembly

<source lang="csharp"> using System; using System.Reflection;

public class Test {

   public static void Main(string[] args)
   {
   Assembly a = null;
       AssemblyName asmName;
     asmName = new AssemblyName();
     asmName.Name = "Test";
     Version v = new Version("1.0.454.30104");
     asmName.Version = v;

       a = Assembly.Load(asmName);
   Type test = a.GetType("Test");
 
   Console.WriteLine("Listing all members for {0}", test);
   MemberInfo[] mi = test.GetMembers();
   foreach(MemberInfo m in mi)
     Console.WriteLine("Type {0}: {1} ",
         m.MemberType.ToString(), m);
   }

}


      </source>


List All Types from an Assembly

<source lang="csharp"> using System; using System.Reflection; public class Test {

   public static void Main(string[] args)
   {
   Assembly a = null;
       AssemblyName asmName;
     asmName = new AssemblyName();
     asmName.Name = "Test";// Test.exe
     Version v = new Version("1.0.454.30104");
     asmName.Version = v;

       a = Assembly.Load(asmName);
   Console.WriteLine("Listing all types in {0}", a.FullName);
   Type[] types = a.GetTypes();
   foreach(Type t in types)
     Console.WriteLine("Type: {0}", t);
   }

}


      </source>


Load assembly from namespace System.Xml

<source lang="csharp">

using System; using System.Reflection; using System.Globalization;

   class MainClass
   {
       public static void ListAssemblies()
       {
           Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
           foreach (Assembly a in assemblies)
           {
               Console.WriteLine(a.GetName());
           }
       }
       public static void Main()
       {
           ListAssemblies();
           string name1 = "System.Data, Version=2.0.0.0," +"Culture=neutral, PublicKeyToken=b77a5c561934e089";
           Assembly a1 = Assembly.Load(name1);
           AssemblyName name2 = new AssemblyName();
           name2.Name = "System.Xml";
           name2.Version = new Version(2, 0, 0, 0);
           name2.CultureInfo = new CultureInfo("");    //Neutral culture.
           name2.SetPublicKeyToken(new byte[] {0xb7, 0x7a, 0x5c, 0x56, 0x19, 0x34, 0xe0, 0x89});
           Assembly a2 = Assembly.Load(name2);
           Assembly a3 = Assembly.Load("SomeAssembly");
           Assembly a4 = Assembly.LoadFrom(@"c:\shared\MySharedAssembly.dll");
           Console.WriteLine("\n\n**** AFTER ****");
           ListAssemblies();
       }
   }
</source>


Loading Assemblies Dynamically with Load() and LoadWithPartialName()

<source lang="csharp"> using System; using System.Reflection; using System.IO;

public class MainClass {

   static void Main(string[] args)
   {
       AssemblyLoader("System.Xml, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false);
       AssemblyLoader("System.Xml", false);
       AssemblyLoader("System.Drawing", true);
   }
   public static void AssemblyLoader(string LoadedAssemblyName, bool PartialName)
   {
       try
       {
           Assembly LoadedAssembly;
           Console.WriteLine("| Loading Assembly {0}", LoadedAssemblyName);
           if(PartialName == true)
               LoadedAssembly = Assembly.LoadWithPartialName(LoadedAssemblyName);
           else
               LoadedAssembly = Assembly.Load(LoadedAssemblyName);
           Console.WriteLine("Full Name: {0}", LoadedAssembly.FullName);
           Console.WriteLine("Location: {0}", LoadedAssembly.Location);
           Console.WriteLine("Code Base: {0}", LoadedAssembly.CodeBase);
           Console.WriteLine("Escaped Code Base: {0}", LoadedAssembly.EscapedCodeBase);
           Console.WriteLine("Loaded from GAC: {0}", LoadedAssembly.GlobalAssemblyCache);
       } catch(FileNotFoundException) {
           Console.WriteLine("EXCEPTION: Cannot load assembly.");
       }
   }

}

      </source>


Location of Assembly

<source lang="csharp"> using System; using System.Reflection; public class MainClass {

   static void Main() {
       Assembly EntryAssembly;
       EntryAssembly = Assembly.GetEntryAssembly();
       Console.WriteLine("Location: {0}", EntryAssembly.Location);
       Console.WriteLine("Code Base: {0}", EntryAssembly.CodeBase);
       Console.WriteLine("Escaped Code Base: {0}", EntryAssembly.EscapedCodeBase);
       Console.WriteLine("Loaded from GAC: {0}", EntryAssembly.GlobalAssemblyCache);
   }

}

</source>


new AssemblyName()

<source lang="csharp"> using System; using System.Reflection; using System.Collections.Generic; class MainClass {

   public static void Main(string[] args)
   {
       AssemblyName assembly1 = new AssemblyName("com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012, Version=1.0.0.0"); 
       Dictionary<string, AssemblyName> assemblyDictionary = new Dictionary<string, AssemblyName>();
       assemblyDictionary.Add("Crypto", assembly1);
       AssemblyName ass1 = assemblyDictionary["Crypto"];
       Console.WriteLine("Got AssemblyName from dictionary: {0}", ass1);
       List<AssemblyName> assemblyList = new List<AssemblyName>();
       assemblyList.Add(assembly1);
       AssemblyName ass2 = assemblyList[0];
       Console.WriteLine("\nFound AssemblyName in list: {0}", ass1);
       Stack<AssemblyName> assemblyStack = new Stack<AssemblyName>();
       assemblyStack.Push(assembly1);
       AssemblyName ass3 = assemblyStack.Pop();
       Console.WriteLine("\nPopped AssemblyName from stack: {0}", ass1);
    }

}

</source>


Retrieving a List of Referenced Assemblies

<source lang="csharp"> using System; using System.Reflection;

public class MainClass {

   static void Main()
   {
       Assembly EntryAssembly;
  
       EntryAssembly = Assembly.GetEntryAssembly();
       foreach(AssemblyName Name in EntryAssembly.GetReferencedAssemblies()){
           Console.WriteLine("Name: {0}", Name.ToString());
       }    
   }

}

      </source>


Set AssemblyTitle, AssemblyDescription, AssemblyConfiguration, AssemblyCompany, AssemblyProduct

<source lang="csharp"> using System.Reflection; using System.Windows.Forms;

[assembly: AssemblyTitle("title")] [assembly: AssemblyDescription("code.")] [assembly: AssemblyConfiguration("Retail")] [assembly: AssemblyCompany("Inc.")] [assembly: AssemblyProduct("C#")] [assembly: AssemblyCopyright("Inc.")] [assembly: AssemblyVersion("1.0.*")]

public class SimpleHelloWorld : Form {

   public static void Main()
   {
       Application.Run(new SimpleHelloWorld());
   }
  
   public SimpleHelloWorld()
   {
       Text = "Hello, WindowsForms!";
   }

}

</source>


Simple Windows Form Application with Version Information

<source lang="csharp">


using System.Reflection; using System.Windows.Forms;

[assembly: AssemblyTitle("This is the title")] [assembly: AssemblyDescription("This is the description")] [assembly: AssemblyConfiguration("Here is for the configuration")] [assembly: AssemblyCompany("Demo 2s, Inc.")] [assembly: AssemblyProduct("C# Demo")] [assembly: AssemblyCopyright("(c) 2002 Demo2s, Inc.")] [assembly: AssemblyVersion("1.0.*")]

public class SimpleHelloWorld : Form {

   public static void Main()
   {
       Application.Run(new SimpleHelloWorld());
   }
  
   public SimpleHelloWorld()
   {
       Text = "Hello, WindowsForms!";
   }

}

      </source>


Use Assembly to indicate the version and culture

<source lang="csharp"> using System; using System.Reflection; [assembly:AssemblyCulture("")] [assembly:AssemblyVersion("1.1.0.5")] class Test{

  public static void Main() {
      Console.WriteLine("www.nfex.ru");
  }

}

      </source>


Working with an Assembly Entry Point

<source lang="csharp"> using System; using System.Reflection;

public class MainClass {

   static void Main(string[] args)
   {
       Assembly EntryAssembly = Assembly.GetEntryAssembly();
       if(EntryAssembly.EntryPoint == null){
           Console.WriteLine("The assembly has no entry point.");
       }else{
           Console.WriteLine(EntryAssembly.EntryPoint.ToString());
       }
   }

}

      </source>