Не удается получить метод из сборки во время выполнения - PullRequest
0 голосов
/ 29 мая 2018

Я использую следующий код, чтобы загрузить сборку во время выполнения, а затем получить ссылку на определенный метод и, очевидно, выполнить ее в конце:

var assemblyLoaded = Assembly.LoadFile(absolutePath);
var type = assemblyLoaded.GetType("CreateContactPlugin.Plugin");

var instance = Activator.CreateInstance(type);

var methodInfo = type.GetMethod("Execute", new Type[] { typeof(System.String)});
if (methodInfo == null)
{
    throw new Exception("No such method exists.");
}

Вот сборка, которую яВызов

namespace CreateContactPlugin
{
   public class Plugin
   {

    static bool Execute(string contactName){
        bool contactCreated = false;
        if (!String.IsNullOrWhiteSpace(contactName))
        {
            //process
        }
        return contactCreated;
    }

  }
 }

Я могу успешно загрузить сборку, тип.Когда я выделяю переменную type , я вижу метод, указанный в массиве DeclaredMethods.Но когда я пытаюсь получить метод, он всегда возвращает ноль.

Кто-нибудь видит, что я могу здесь делать неправильно?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Проблема "статическая" из

static bool Execute(string contactName)

поставить как

public bool Execute(string contactName)
0 голосов
/ 29 мая 2018

Здесь есть пара проблем.Прежде всего, метод 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...