2012-03-31 3 views
1

У меня есть DLL, содержащая некоторые методы (показать, скрыть и проверить). Ниже приведен пример одного из методов hide(Panel paneldynamic, String id, List<EventActions> eventList). Все методы содержат одни и те же параметры.Динамически вызывать метод в DLL

Теперь я ссылаюсь на свою DLL на мою основную форму, как я могу динамически вызывать один из методов во время выполнения?

ответ

10

Вам нужно использовать отражение. Во-первых, загрузить сборку (обратите внимание, что это предполагает, что вы импортировали System.Reflection):

Assembly a = Assembly.LoadFile(pathToTheDll); 

Получить тип, содержащий метод, полное имя:

Type t = a.GetType("Some.Class"); 

Теперь, получить метод:

MethodInfo m = t.GetMethod("hide"); // For example 

Тогда все, что вам нужно сделать, это вызвать его:

m.Invoke(null, new object[] { /* parameters go here */ }); 

Первый аргумент Invoke - это экземпляр. Если ваш класс равен static, используйте null, в противном случае вам нужно указать экземпляр типа, созданного с помощью Assembly.CreateInstance.

3

Вставьте ваши методы, как делегаты в словарь

public enum MethodType 
{ 
    None, 
    Show, 
    Hide, 
    Validate 
} 

var methods = new Dictionary<MethodType, Action<Panel, String, List<EventActions>>(); 
methods.Add(MethodType.Show, show); 
methods.Add(MethodType.Hide, hide); 
methods.Add(MethodType.Validate, validate); 

Затем вы можете вызвать один из них с

MethodType methodToInvoke = MethodType.Hide; 
methods[methodToInvoke](paneldynamic, id, eventList); 

Если вы собираетесь динамически загрузить DLL, это другая история , Вам понадобятся как минимум три сборки (три проекта): одна главная сборка (exe), одна контрактная сборка (dll) и одна сборка (dll). Основной и подключаемый модуль должны ссылаться на контрактную сборку. Сборку договор содержит интерфейс

public interface IPlugIn 
{ 
    void Show(Panel paneldynamic, String id, List<EventActions> eventList); 
    void Hide(Panel paneldynamic, String id, List<EventActions> eventList); 
    void Validate(Panel paneldynamic, String id, List<EventActions> eventList); 
} 

разъем.подкл содержит класс, реализующий интерфейс

public class PlugIn : IPlugIn 
{ 
    // TODO: implement IPlugIn 
} 

В основном узле вы можете загрузить плагин, как это

IPlugIn LoadPlugInFromFile(string fileName) 
{ 
    Assembly asm = Assembly.LoadFrom(fileName); 
    Type type = asm.GetType("PlugIn"); 
    IPlugIn plugIn = (IPlugIn)Activator.CreateInstance(type); 
    return plugIn; 
} 

Вызывайте так:

IPlugIn plugIn = LoadPlugInFromFile("C:\PlugIns\MyPlugIn.dll"); 
plugIn.Show(paneldynamic, id, eventList); 
1

Вы можете получить тип методом Reflection и invoke следующим образом:

type.InvokeMember("hide", BindingFlags.InvokeMethod | BindingFlags.Static | 
BindingFlags.Public, null, null, new object[] { paneldynamic, id, eventList }); 
Смежные вопросы