Cannot get Method from assembly at runtime

Refresh

November 2018

Views

64 time

2

I'm using the following code to load an assembly at runtime and then get a reference to a specific method and obviously execute it at the end:

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.");
}

Here is the assembly that I'm calling

namespace CreateContactPlugin
{
   public class Plugin
   {

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

  }
 }

I can succesfully load the Assembly, the Type. When I highlight the type variable, I see the method listed in the DeclaredMethods array. But when I try to get the Method, it returns always null.

Does somebody see what I might be doing wrong here ?

2 answers

0

Проблема заключается в «статической» из

static bool Execute(string contactName)

положить его в качестве

public bool Execute(string contactName)
2

Там есть несколько проблем здесь. Прежде всего 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");