Csharp/CSharp Tutorial/Assembly/Assembly Load
Содержание
- 1 Assemblies
- 2 Assembly Loader
- 3 Assembly unloading
- 4 Create Type by Assembly qualifed type name
- 5 Deeper Reflection: Listing All the Types in an Assembly
- 6 difference between Assembly.Load and Assembly.LoadFrom
- 7 Dynamic assembly introspection
- 8 GetManifestResourceStream
- 9 Late Binding
- 10 Load the System.Xml assembly using an AssemblyName
- 11 Load types(classes) from a Assembly(exe file)
Assemblies
To quote Microsoft, "Assemblies are the building blocks of the .NET Framework."
An assembly is composed of four sections.
- The first is the assembly manifest.
- The manifest contains information about the assembly itself.
- The manifest includes such things as the name of the assembly, its version number, type mapping information, and cultural settings.
- The second section is type metadata
- The type metadata is information about the data types.
- The type metadata aids in cross-language interoperability.
- The third part of an assembly is the program code stored in Microsoft Intermediate Language (MSIL) format.
- The fourth constituent of an assembly is the resources used by the program.
12.4.Assembly Load 12.4.1. Assemblies 12.4.2. <A href="/Tutorial/CSharp/0240__Assembly/differencebetweenAssemblyLoadandAssemblyLoadFrom.htm">difference between Assembly.Load and Assembly.LoadFrom</a> 12.4.3. <A href="/Tutorial/CSharp/0240__Assembly/LoadtypesclassesfromaAssemblyexefile.htm">Load types(classes) from a Assembly(exe file)</a> 12.4.4. <A href="/Tutorial/CSharp/0240__Assembly/LoadtheSystemXmlassemblyusinganAssemblyName.htm">Load the System.Xml assembly using an AssemblyName</a> 12.4.5. <A href="/Tutorial/CSharp/0240__Assembly/CreateTypebyAssemblyqualifedtypename.htm">Create Type by Assembly qualifed type name</a> 12.4.6. <A href="/Tutorial/CSharp/0240__Assembly/LateBinding.htm">Late Binding</a> 12.4.7. <A href="/Tutorial/CSharp/0240__Assembly/Assemblyunloading.htm">Assembly unloading</a> 12.4.8. <A href="/Tutorial/CSharp/0240__Assembly/Dynamicassemblyintrospection.htm">Dynamic assembly introspection</a> 12.4.9. <A href="/Tutorial/CSharp/0240__Assembly/DeeperReflectionListingAlltheTypesinanAssembly.htm">Deeper Reflection: Listing All the Types in an Assembly</a> 12.4.10. <A href="/Tutorial/CSharp/0240__Assembly/AssemblyLoader.htm">Assembly Loader</a> 12.4.11. <A href="/Tutorial/CSharp/0240__Assembly/GetManifestResourceStream.htm">GetManifestResourceStream</a>
Assembly Loader
<source lang="csharp">using System; using System.Reflection; using System.IO; public class AssemblyLoader {
private Assembly LoadedAssembly; public AssemblyLoader(string LoadedAssemblyName, bool PartialName) { Console.WriteLine(LoadedAssemblyName); if(PartialName == true) LoadedAssembly = Assembly.LoadWithPartialName(LoadedAssemblyName); else LoadedAssembly = Assembly.Load(LoadedAssemblyName); WritePropertiesToConsole(); } private void WritePropertiesToConsole() { 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); }
} public class MainClass {
static void Main(string[] args) { AssemblyLoader Loader; Loader = new AssemblyLoader("System.Xml, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false); Loader = new AssemblyLoader("System.Xml", false); Loader = new AssemblyLoader("System.Xml", true); }
}</source>
Assembly unloading
<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Security.Policy; public class MainClass {
public static void Main() { AppDomain ad = AppDomain.CreateDomain("IsolatedDLL"); AppDomain.Unload(ad); }
}</source>
Create Type by Assembly qualifed type name
<source lang="csharp">using System; using System.Text; class MainClass {
public static void Main() { Type t5 = Type.GetType("System.Data.DataSet,System.Data," + "Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"); }
}</source>
Deeper Reflection: Listing All the Types in an Assembly
<source lang="csharp">using System; using System.Reflection; enum MyEnum {
Val1, Val2, Val3
} class MyClass { } struct MyStruct { } class MainClass {
public static void Main(String[] args) { Assembly a = Assembly.LoadFrom (args[0]); Type[] types = a.GetTypes(); foreach (Type t in types) { Console.WriteLine ("Name: {0}", t.FullName); Console.WriteLine ("Namespace: {0}", t.Namespace); Console.WriteLine ("Base Class: {0}", t.BaseType.FullName); } }
}</source>
difference between Assembly.Load and Assembly.LoadFrom
<source lang="csharp">using System; using System.Reflection; class Starter {
static void Main() { Assembly library = Assembly.Load("library, Version=2.0.0.0, " + "Culture=Neutral, PublicKeyToken=9b184fc90fb9648d"); Console.WriteLine("Assembly.Load: {0}", library.FullName); library = Assembly.LoadFrom("library.dll"); Console.WriteLine("Assembly.LoadFrom {0}", library.FullName); }
}</source>
Dynamic assembly introspection
<source lang="csharp">using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Reflection; using System.Reflection.Emit; public class MainClass {
public static void Main() { int x = 10; Assembly a = Assembly.Load("mscorlib"); Type t3 = a.GetType("System.Int32"); Type t1 = typeof(int); Type t2 = x.GetType(); Type t4 = Type.GetType("System.Int32"); Console.WriteLine(t1 == t2); Console.WriteLine(t2 == t3); Console.WriteLine(t3 == t4); }
}</source>
True True True
GetManifestResourceStream
<source lang="csharp">using System; using System.IO; using System.Reflection; using System.Collections.Generic; public class Loader {
static Dictionary<string, Assembly> libs = new Dictionary<string, Assembly>(); static void Main() { AppDomain.CurrentDomain.AssemblyResolve += FindAssem; Program.Go(); } static Assembly FindAssem(object sender, ResolveEventArgs args) { string shortName = new AssemblyName(args.Name).Name; if (libs.ContainsKey(shortName)) return libs[shortName]; using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("Libs." + shortName + ".dll")) { byte[] data = new BinaryReader(s).ReadBytes((int)s.Length); Assembly a = Assembly.Load(data); libs[shortName] = a; return a; } }
} public class Program {
public static void Go() { }
}</source>
Late Binding
<source lang="csharp">using System; using System.Reflection; using System.IO; public class MainClass {
public static int Main(string[] args) { Assembly a = null; try { a = Assembly.Load("YourLibraryName"); } catch(FileNotFoundException e) {Console.WriteLine(e.Message);} Type classType = a.GetType("YourLibraryName.ClassName"); object obj = Activator.CreateInstance(classType); MethodInfo mi = classType.GetMethod("MethodName"); mi.Invoke(obj, null); object[] paramArray = new object[2]; paramArray[0] = "Fred"; paramArray[1] = 4; mi = classType.GetMethod("MethodName2"); mi.Invoke(obj, paramArray); return 0; }
}</source>
Load the System.Xml assembly using an AssemblyName
<source lang="csharp">using System; using System.Reflection; using System.Globalization; class MainClass {
public static void Main() { 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); }
}</source>
Load types(classes) from a Assembly(exe file)
<source lang="csharp">using System;
class MyClass {
int x; int y; public MyClass(int i) { Console.WriteLine("Constructing MyClass(int). "); x = y = i; show(); } public MyClass(int i, int j) { Console.WriteLine("Constructing MyClass(int, int). "); x = i; y = j; show(); } public int sum() { return x+y; } public bool isBetween(int i) { if((x < i) && (i < y)) return true; else return false; } public void set(int a, int b) { Console.Write("Inside set(int, int). "); x = a; y = b; show(); } // Overload set. public void set(double a, double b) { Console.Write("Inside set(double, double). "); x = (int) a; y = (int) b; show(); } public void show() { Console.WriteLine("Values are x: {0}, y: {1}", x, y); }
}
class AnotherClass {
string remark; public AnotherClass(string str) { remark = str; } public void show() { Console.WriteLine(remark); }
}
///////////////////////////////////// using System; using System.Reflection;
class MainClass {
public static void Main() { int val; Assembly asm = Assembly.LoadFrom("MyClasses.exe"); Type[] alltypes = asm.GetTypes(); foreach(Type temp in alltypes) Console.WriteLine("Found: " + temp.Name); Console.WriteLine(); }
}</source>