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
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
Im Allgemeinen verwenden Sie System.Reflection-Klassen, um diese Aufgabe auszuführen.
Insbesondere würden Sie die DLL über Assembly.Load (oder Assembly.LoadFrom) laden und dann Assembly.GetTypes anrufen und dann für jeden Typ Anruf Type.GetMethods. Wenn Sie eine MethodInfo haben, können Sie MethodInfo.Invoke darauf anrufen.
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.
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);
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);
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 –
@Dan: True. Dies ist jedoch nur möglich, wenn Sie die Signatur zum Zeitpunkt der Kompilierung kennen. – SLaks
oder verwenden Sie DynamicMethod. – codekaizen