2010-01-31 20 views
9

Ich frage mich, ob es möglich ist, eine .NET-DLL zur Laufzeit zu laden, die verfügbaren Methoden anzuzeigen und eine zur Laufzeit auszuführen.Aufrufmethode zur Laufzeit

Wenn dies möglich ist, könnten Sie mir zeigen in die richtige Richtung

Antwort

3

Sie müssen Reflection verwenden.

Sie können Assembly.LoadFile nennen eine DLL, die eine .NET-Assembly zu laden, dann rufen Sie die GetTypes Methode auf das zurück Assembly Objekt in den Klassen in der DLL zu suchen.
Sobald Sie ein Type Objekt für die Klasse gefunden haben, an der Sie interessiert sind, können Sie die InvokeMember Methode aufrufen, um eine Funktion aufzurufen.

Vorsicht, die Reflexion kann sehr langsam sein.

+0

Sie die Leistung der Aufruf einer Methode durch Reflexion durch die Verwendung 'Delegate.CreateDelegate (...)', anstatt sich verbessern die Methode und nennen es rein durch Reflexion: http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx –

+1

@Dan: True. Dies ist jedoch nur möglich, wenn Sie die Signatur zum Zeitpunkt der Kompilierung kennen. – SLaks

+0

oder verwenden Sie DynamicMethod. – codekaizen

1

fand ich dies bei reflection eamples

// get all public static methods of MyClass type 
    MethodInfo[] methodInfos = typeof(MyClass).GetMethods(BindingFlags.Public | 
                BindingFlags.Static); 


[C#] 
// dynamically load assembly from file Test.dll 
Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll"); 

[C#] 
// get type of class Calculator from just loaded assembly 
Type calcType = testAssembly.GetType("Test.Calculator"); 

[C#] 
// create instance of class Calculator 
object calcInstance = Activator.CreateInstance(calcType); 

[C#] 
// get info about property: public double Number 
PropertyInfo numberPropertyInfo = calcType.GetProperty("Number"); 

[C#] 
// get value of property: public double Number 
double value = (double)numberPropertyInfo.GetValue(calcInstance, null); 

[C#] 
// set value of property: public double Number 
numberPropertyInfo.SetValue(calcInstance, 10.0, null); 

[C#] 
// get info about static property: public static double Pi 
PropertyInfo piPropertyInfo = calcType.GetProperty("Pi"); 

[C#] 
// get value of static property: public static double Pi 
double piValue = (double)piPropertyInfo.GetValue(null, null); 

[C#] 
// invoke public instance method: public void Clear() 
calcType.InvokeMember("Clear", 
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, 
null, calcInstance, null); 

[C#] 
// invoke private instance method: private void DoClear() 
calcType.InvokeMember("DoClear", 
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, 
null, calcInstance, null); 

[C#] 
// invoke public instance method: public double Add(double number) 
double value = (double)calcType.InvokeMember("Add", 
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, 
null, calcInstance, new object[] { 20.0 }); 

[C#] 
// invoke public static method: public static double GetPi() 
double piValue = (double)calcType.InvokeMember("GetPi", 
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, 
null, null, null); 

[C#] 
// get value of private field: private double _number 
double value = (double)calcType.InvokeMember("_number", 
BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic, 
null, calcInstance, null); 
3

Ja, das ist möglich, Sie starten Sie einfach mit Ihrem DLL geladen:

Assembly assembly = Assembly.LoadFrom(assemblyPath); 

Und dann ein Verfahren in Ihrem dll aufrufen Sie werde muss reflection verwenden.

object obj = assembly.CreateInstance(<type.FullName>); 

Dabei ist type.FullName die FullName-Eigenschaft eines Typs in dieser Baugruppe.

Sobald Sie Ihre Instanz haben, können Sie Ihre Methode wie folgt aufrufen:

MethodInfo methodInfo = obj.GetMethod("MyMethod"); 
methodInfo.Invoke(obj,null);