Mi chiedo se è possibile caricare una DLL .net in fase di esecuzione, visualizzare i metodi disponibili ed eseguirne uno in fase di esecuzione.metodo call in fase di esecuzione
Se questo è possibile mi può puntare nella giusta direzione
Mi chiedo se è possibile caricare una DLL .net in fase di esecuzione, visualizzare i metodi disponibili ed eseguirne uno in fase di esecuzione.metodo call in fase di esecuzione
Se questo è possibile mi può puntare nella giusta direzione
In genere, si utilizzano le classi System.Reflection per eseguire questa attività.
In particolare, ci si caricare la DLL tramite Assembly.Load (o Assembly.LoadFrom) e quindi chiamare Assembly.GetTypes e poi per ogni tipo di chiamata Type.GetMethods. Quando hai un MethodInfo, puoi chiamare MethodInfo.Invoke su di esso.
È necessario utilizzare Reflection.
È possibile chiamare Assembly.LoadFile
per caricare una DLL che contiene un assembly .NET, quindi chiamare il metodo GetTypes
sul Assembly
oggetto restituito a guardare le classi nel DLL.
Una volta trovato un oggetto Type
per la classe che ti interessa, puoi chiamare il suo metodo InvokeMember
per chiamare una funzione.
Attenzione che il riflesso può essere piuttosto lento.
ho trovato questo a 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);
Sì, questo è possibile, basta iniziare con caricare la DLL:
Assembly assembly = Assembly.LoadFrom(assemblyPath);
E poi a invocare un metodo dentro la DLL Avrete utilizzare reflection.
object obj = assembly.CreateInstance(<type.FullName>);
dove type.FullName
è la proprietà FullName di un determinato tipo in tale assembly.
Una volta ottenuto il vostro esempio, è possibile richiamare il metodo come questo:
MethodInfo methodInfo = obj.GetMethod("MyMethod");
methodInfo.Invoke(obj,null);
È possibile migliorare le prestazioni di invocare un metodo attraverso la riflessione utilizzando 'Delegate.CreateDelegate (...)' invece di ottenere il metodo e chiamandolo esclusivamente per riflessione: http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx –
@Dan: True. Tuttavia, questo è possibile solo se conosci la firma al momento della compilazione. – SLaks
o utilizzare DynamicMethod. – codekaizen