我们有一个asp.net 4.7项目,我们试图在另一个dll文件中调用方法(从/ Bin内部的一个dll文件中调用)
这是项目结构的外观:
我们的主要项目
编译项目时,所有文件将自动复制到Asp.net项目文件夹/ Bin
在我们的图书馆项目中,我们有invoke方法:
public string InvokeString(string typeName, string methodName)
{
Type calledType = Type.GetType(typeName);
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public,
null,
null,
null);
return s;
}
在框架项目中,我们具有调用要调用的方法的函数:
new Lib_Invoke().InvokeString("WA.Extension.Pages.Extension", "Init");
最后是我们的WA.Extension.Pages:
namespace WA.Extension.Pages
{
public class Extension
{
public void Init()
{
HttpContext.Current.Response.Write("hello from extension");
}
}
}
但是到目前为止,它给我的只是
System.NullReferenceException: Object reference not set to an instance of an object.
我已经仔细检查了引用,应该可以使用。
编辑:
在使用它并在该线程的帮助下,我最终得到了这个结果:
public string InvokeString(string assemblyName, string namespaceName, string typeName, string methodName)
{
Type calledType = Type.GetType(namespaceName + "." + typeName + "," + assemblyName);
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null,
Activator.CreateInstance(calledType),
null);
return s;
}
添加的重要内容之一是绑定标记中的临时名称和Activator.CreateInstance(称为Type)。
所以当我想调用该方法时:
new Lib_Invoke()。InvokeString(“ WA.Extension.Pages”,“ WA.Extension.Pages”,“ Extension”,“ Init”);
感谢您的帮助!
答案 0 :(得分:0)
Init()
是您的示例中的实例(非静态)方法。您应该添加BindingFlag.Instance
并提供Extension
类型的目标对象:
public static string InvokeString(string typeName, string methodName)
{
Type calledType = Type.GetType(typeName);
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
null,
Activator.CreateInstance(calledType),
null);
return s;
}
或者您可以将Init()
方法标记为static
:
public static void Init()
{
HttpContext.Current.Response.Write("hello from extension");
}
并仅添加一个BindingFlag.Static
:
public static string InvokeString(string typeName, string methodName)
{
Type calledType = Type.GetType(typeName);
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
null,
null,
null);
return s;
}
之后,尝试调试Init()
方法。我怀疑HttpContext.Current
可能是null
。在这种情况下,您可以将HttpContext
实例作为参数传递给InvokeMember
:
public static void Init(HttpContext ctx)
{
ctx.Response.Write("hello from extension");
}
和:
public static string InvokeString(string typeName, string methodName)
{
Type calledType = Type.GetType(typeName);
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
null,
null,
new object[] { HttpContext.Current });
return s;
}
希望有帮助。