3

我已经main.exe加载了一个 dll,从加载的 dll 中,我尝试获取主 exe 中定义的静态类,因此 dll 项目中的代码将是:

static class DllClass
{
    static DllClass()
    {
        Assembly assembly = Assembly.GetEntryAssembly(); // line 1
        Type type = assembly.GetType("StaticClass");    //line 2
    }
}

但是,第 2 行给了我以下异常

System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.TypeInitializationException:“DllClass”的类型初始化程序引发了异常。---> System.TypeInitializationException:“DllClass”的类型初始化程序引发了异常。---> System.NullReferenceException:对象引用未设置为对象的实例。

我认为这里的问题是在运行时找不到静态类 StatisClass 并返回 null。

任何想法如何解决它?

4

3 回答 3

3

使用上面的代码只能有一个原因:您的assembly变量是NULL. 那么什么时候会发生这种情况呢?根据MSDN,只有一种情况:

从非托管应用程序加载托管程序集时,GetEntryAssembly 方法可以返回 NULL。例如,如果非托管应用程序创建用 C# 编写的 COM 组件的实例,则从 C# 组件调用 GetEntryAssembly 方法将返回 NULL,因为进程的入口点是非托管代码而不是托管程序集。

在这种情况下,@Beachwalker 的答案也不起作用。此外,如果您动态加载类型,代码甚至不会编译。

于 2012-12-12T08:56:49.710 回答
1

使用反射时,只能使用全名检索类型。即,包括“命名空间”以及类名。

因此,如下更改第 2 行,它将起作用:

Type type = assembly.GetType("NamespaceName.StaticClass");    //line 2
于 2012-12-12T09:13:11.567 回答
0

仅使用以下内容怎么样:

Type t = typeof(StaticClass) 

也许你会因为这个而得到 NullReferenceException:

“从非托管应用程序加载托管程序集时,GetEntryAssembly 方法可以返回空引用(在 Visual Basic 中为无)。例如,如果非托管应用程序创建了一个用 C# 编写的 COM 组件的实例,则调用 GetEntryAssembly C# 组件中的方法返回 null,因为进程的入口点是非托管代码而不是托管程序集。”

(MSDN, http: //msdn.microsoft.com/library/system.reflection.assembly.getentryassembly (v=vs.80).aspx )

=> 需要测试:

if (assembly != null)
{
 ...
}
于 2012-12-12T08:54:47.447 回答