【问题标题】:GetType("ClassName).GetMethod("MethodName") throws errorGetType("ClassName).GetMethod("MethodName") 抛出错误
【发布时间】:2013-10-01 20:35:57
【问题描述】:

我正在尝试更多地了解 Assembly 类及其方法,在此 URL 上有一个示例如下:

但是,方法:assem.GetType("Example").GetMethod("SampleMethod") 抛出异常错误并抱怨没有对象引用。

似乎该方法之前的方法也返回null。有什么想法吗?

using System;
using System.Reflection;
using System.Security.Permissions;

[assembly:AssemblyVersionAttribute("1.0.2000.0")]

public class Example
{
    private int factor;
    public Example(int f)
    {
        factor = f;
    }

    public int SampleMethod(int x) 
    { 
        Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
        return x * factor;
    }

    public static void Main()
    {
        Assembly assem = Assembly.GetExecutingAssembly();

        Console.WriteLine("Assembly Full Name:");
        Console.WriteLine(assem.FullName);

        // The AssemblyName type can be used to parse the full name.
        AssemblyName assemName = assem.GetName();
        Console.WriteLine("\nName: {0}", assemName.Name);
        Console.WriteLine("Version: {0}.{1}", 
            assemName.Version.Major, assemName.Version.Minor);

        Console.WriteLine("\nAssembly CodeBase:");
        Console.WriteLine(assem.CodeBase);

        // Create an object from the assembly, passing in the correct number
        // and type of arguments for the constructor.
        Object o = assem.CreateInstance("Example", false, 
            BindingFlags.ExactBinding, 
            null, new Object[] { 2 }, null, null);

        // Make a late-bound call to an instance method of the object.    
        MethodInfo m = assem.GetType("Example").GetMethod("SampleMethod");
        Object ret = m.Invoke(o, new Object[] { 42 });
        Console.WriteLine("SampleMethod returned {0}.", ret);

        Console.WriteLine("\nAssembly entry point:");
        Console.WriteLine(assem.EntryPoint);
    }
}

/* 此代码示例产生类似于以下的输出:

程序集全名: 来源,版本=1.0.2000.0,文化=中性,PublicKeyToken=null

名称:来源 版本:1.0

汇编代码库: file:///C:/sdtree/AssemblyClass/cs/source.exe

Example.SampleMethod(42) 执行。 SampleMethod 返回 84。

程序集入口点: 无效的主要() */

【问题讨论】:

  • 我猜GetType(..) 返回null。请隔离实际问题 - 如果 GetType 确实返回 null,则 GetMethod 完全无关。
  • 所以你给了我们一个可以工作的程序......那么一个工作的程序呢? (该代码绝对适合我……目前尚不清楚您是否正在运行该确切代码并遇到问题,或者是什么……)
  • 我可以重现这个 if 我把这段代码放在一个命名空间中。鉴于此,-1 表示不包括实际代码。

标签: c# .net-assembly


【解决方案1】:

如果你看一下 Assembly.CreateInstance 方法(你可以找到描述here) 你可以在这段代码中看到:

 Object o = assem.CreateInstance("Example", false, 
        BindingFlags.ExactBinding, 
        null, new Object[] { 2 }, null, null);

您根本没有真正为 'o' 分配任何值。

然后,正如我之前所说,您不会通过以下方式返回它:

assem.GetType("Example")

添加命名空间确实可以解决问题。

以后,请尝试隔离问题以找出问题所在。 simlpy 帮助调试

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2012-10-28
    相关资源
    最近更新 更多