我有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。
任何想法如何解决?
答案 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)
{
...
}