2013-02-19 58 views
1

我正在为使用C#开发的shell创建附加系统。我跟着thisthis。这里是我的函数加载一个附加:System.NullReferenceException尝试从DLL文件加载函数 - C#

public void loadAppFromDLL(string assemblyFile) 
{ 
    Assembly a = Assembly.Load(assemblyFile); 
    Type app = a.GetType("App"); 
    MethodInfo loadMethod = app.GetMethod("load"); 
    object appInstance = Activator.CreateInstance(app); 
    loadMethod.Invoke(appInstance, null); 
} 

这里是附加:

using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace App 
{ 
    public class App 
    { 
     public void load() 
     { 
      MessageBox.Show("Application loaded successfully!"); 
     } 
    } 
} 

当我打造的插件,我把它放在同一个目录中壳可执行文件并调用:

LoadExternalApp lea = new LoadExternalApp(); 
lea.loadAppFromDLL("SampleApp"); 

(LoadExternalApp包含DLL加载功能)

当我调试我的壳,我注意到:

  1. 的应用程序没有启动
  2. 有一个System.NullReferenceException

什么我不这样做对吗?

+0

你看过托管扩展框架吗?微软已经为你写了一个相当不错的插件系统;-) – 2013-02-19 14:06:14

+0

几乎所有'NullReferenceException'的情况都是一样的。请参阅“[什么是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)”的一些提示。 – 2013-02-19 14:08:15

回答

2

此:

Type app = a.GetType("App"); 

正在寻找与App一个命名空间限定名称的类型。

您的类型在App的名称空间中名为App,所以Assembly.GetType返回null,然后您将对其进行解引用。相反,您应该使用:

Type app = a.GetType("App.App"); 

但是,you shouldn't give a class the same name as its namespace in the first place。解决这个问题,让你最终的东西更像是:

Type app = a.GetType("App.PlugIn"); 

你还是应该检查GetType(或GetMethod)是否返回null,以相当多优雅地失败,并与更多的信息。

此外,您应该开始遵循.NET命名约定 - 在PascalCase中提供方法名称。噢,你可能想为你的加载项考虑一个通用接口,而不是依靠反射来调用方法。