无法在运行时从程序集中获取方法
Cannot get Method from assembly at runtime
我正在使用以下代码在运行时加载程序集,然后获取对特定方法的引用并显然在最后执行它:
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 数组中列出的方法。但是当我尝试获取方法时,它 returns 总是空的。
有人看到我这里可能做错了什么吗?
这里有几个问题。首先,Execute
方法是 static
而不是 public
,因此您需要指定正确的绑定标志才能使用它。
var methodInfo = type.GetMethod("Execute", BindingFlags.Static | BindingFlags.NonPublic);
但是,使用较少反射和强类型的另一种(在我看来更可取)解决方案是让您的插件 class 实现一个通用接口,这样您就可以强类型 instance
目的。先做一个class库,里面有相关的接口,例如:
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");
问题是"static"个
static bool Execute(string contactName)
把它写成
public bool Execute(string contactName)
我正在使用以下代码在运行时加载程序集,然后获取对特定方法的引用并显然在最后执行它:
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 数组中列出的方法。但是当我尝试获取方法时,它 returns 总是空的。
有人看到我这里可能做错了什么吗?
这里有几个问题。首先,Execute
方法是 static
而不是 public
,因此您需要指定正确的绑定标志才能使用它。
var methodInfo = type.GetMethod("Execute", BindingFlags.Static | BindingFlags.NonPublic);
但是,使用较少反射和强类型的另一种(在我看来更可取)解决方案是让您的插件 class 实现一个通用接口,这样您就可以强类型 instance
目的。先做一个class库,里面有相关的接口,例如:
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");
问题是"static"个
static bool Execute(string contactName)
把它写成
public bool Execute(string contactName)