在具有名称空间的asp.net项目中的另一个DLL中调用方法

时间:2018-09-02 01:58:38

标签: c# asp.net invoke

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

这是项目结构的外观:

我们的主要项目

  • 子项目:Asp.net项目-托管在网络服务器上
  • 另一个名为WA.Core.Framework的子项目
  • 另一个名为WA.Core.Libary的子项目
  • 另一个子项目称为WA.Extension.Pages

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

Image

在我们的图书馆项目中,我们有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”);

感谢您的帮助!

1 个答案:

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

希望有帮助。