C#从加载的Dll中调用主exe中静态类的GetType

时间:2012-12-12 08:45:50

标签: c# exception reflection

我有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。

任何想法如何解决?

3 个答案:

答案 0 :(得分:3)

使用上面的代码,只有一个原因:您的assembly变量为NULL。那么什么时候会发生?根据{{​​3}},只有一个案例:

  

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

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

答案 1 :(得分:1)

使用反射时,只能使用全名来检索类型。 即包括“名称空间”和类名。

所以,改变第2行,如下所示:

Type type = assembly.GetType("NamespaceName.StaticClass");    //line 2

答案 2 :(得分:0)

如何使用以下内容:

Type t = typeof(StaticClass) 

因为这个原因,你可能会得到NullReferenceException:

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

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

=>需要测试:

if (assembly != null)
{
 ...
}