使用命名空间在 asp.net 项目中的另一个 DLL 中调用方法



我们有一个 asp.net 4.7 项目,我们试图在另一个 dll 文件中调用一个方法(从/Bin 中的一个 dll 文件(

项目结构如下所示:

我们的主要项目

  • 子项目:Asp.net 项目 - 托管在 Web 服务器上
  • 另一个子项目称为WA。核心框架
  • 另一个子项目称为WA。核心图书馆
  • 另一个子项目称为WA。扩展页面

编译项目时,所有文件将自动复制到 Asp.net 项目文件夹/Bin

图像

在我们的库项目中,我们有调用方法:

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

最后在我们的西澳。扩展页面我们有:

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;
}

添加的重要内容之一是绑定标志中的asambly名称和Activator.CreateInstance(calledType(。

所以当我想调用该方法时:

新Lib_Invoke((。InvokeString("WA.扩展页面", "WA.Extension.Pages", "Extension", "Init"(;

感谢您的帮助!

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;
}

希望对您有所帮助。

相关内容

  • 没有找到相关文章

最新更新