Csharp/C Sharp/Reflection/Assembly
Содержание
- 1 AssemblyCulture AssemblyVersion
- 2 AssemblyName: Name, Version, CultureInfo, SetPublicKeyToken
- 3 Create assembly
- 4 CurrentDomain, GetAssemblies
- 5 Dynamically invoking methods from classes in an assembly.
- 6 Examining Location Information
- 7 Find Attribytes from assembly name
- 8 Finding and Creating Assembly Types
- 9 Get current application domain
- 10 GetReferencedAssemblies
- 11 List All Members from an Assembly
- 12 List All Types from an Assembly
- 13 Load assembly from namespace System.Xml
- 14 Loading Assemblies Dynamically with Load() and LoadWithPartialName()
- 15 Location of Assembly
- 16 new AssemblyName()
- 17 Retrieving a List of Referenced Assemblies
- 18 Set AssemblyTitle, AssemblyDescription, AssemblyConfiguration, AssemblyCompany, AssemblyProduct
- 19 Simple Windows Form Application with Version Information
- 20 Use Assembly to indicate the version and culture
- 21 Working with an Assembly Entry Point
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>