Мне интересно, можно ли загружать DLL .net во время выполнения, просматривать доступные методы и выполнять их во время выполнения.метод вызова во время выполнения
Если это возможно, могли бы вы мне точку в правильном направлении
Мне интересно, можно ли загружать DLL .net во время выполнения, просматривать доступные методы и выполнять их во время выполнения.метод вызова во время выполнения
Если это возможно, могли бы вы мне точку в правильном направлении
Как правило, для выполнения этой задачи используются классы System.Reflection.
В частности, вы бы загрузить DLL с помощью Assembly.Load (или Assembly.LoadFrom), а затем вызвать Assembly.GetTypes, а затем для каждого типа вызова Type.GetMethods. Когда у вас есть MethodInfo, вы можете позвонить ему MethodInfo.Invoke.
Вы должны использовать Reflection.
Вы можете позвонить Assembly.LoadFile
загрузить .DLL, содержащий сборку .Net, а затем вызвать метод GetTypes
на возвращаемом Assembly
объекта, чтобы посмотреть на классы в DLL.
Как только вы нашли объект Type
для интересующего вас класса, вы можете вызвать его метод InvokeMember
для вызова функции.
Остерегайтесь того, что отражение может быть довольно медленным.
Я нашел это в 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);
Да, это возможно, вы просто начать с загрузкой библиотеки DLL:
Assembly assembly = Assembly.LoadFrom(assemblyPath);
А затем вызвать метод внутри библиотеки DLL вы необходимо использовать reflection.
object obj = assembly.CreateInstance(<type.FullName>);
где type.FullName
- свойство FullName какого-либо типа в этой сборке.
После того, как вы получили свой экземпляр, вы можете вызвать свой метод так:
MethodInfo methodInfo = obj.GetMethod("MyMethod");
methodInfo.Invoke(obj,null);
Вы можете улучшить производительность вызова метода с помощью отражения с помощью 'Delegate.CreateDelegate (...)' вместо того, чтобы метод и называя его чисто отражением: http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx –
@Dan: True. Однако это возможно только в том случае, если вы знаете подпись во время компиляции. – SLaks
или используйте DynamicMethod. – codekaizen