Здесь есть пара проблем.Прежде всего, метод Execute
это static
, а не public
, поэтому вам нужно указать правильные флаги привязки, чтобы получить его.
var methodInfo = type.GetMethod("Execute", BindingFlags.Static | BindingFlags.NonPublic);
Однако альтернатива (и, на мой взгляд, предпочтительнее)) решение, использующее меньше размышлений и строгую типизацию, заключалось бы в том, чтобы ваш класс плагина реализовал общий интерфейс, чтобы вы могли строго набирать объект instance
.Сначала создайте библиотеку классов с соответствующими интерфейсами, например:
public interface IContactPlugin
{
bool Execute(string contactName);
}
Теперь ваш плагин может также ссылаться на ту же библиотеку и становится следующим:
namespace CreateContactPlugin
{
public class Plugin : IContactPlugin
{
public bool Execute(string contactName)
{
//snip
}
}
}
И ваш код вызовабудет теперь это:
var assemblyLoaded = Assembly.LoadFile(absolutePath);
var type = assemblyLoaded.GetType("CreateContactPlugin.Plugin");
var instance = Activator.CreateInstance(type) as IContactPlugin;
if (instance == null)
{
//That type wasn't an IContactPlugin, do something here...
}
instance.Execute("name of contact");