2013-02-19 29 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中提供方法名稱。噢,你可能想爲你的加載項考慮一個通用接口,而不是依靠反射來調用方法。