2013-02-19 2 views
1

Я создаю дополнительную систему для оболочки, которую я разрабатываю с помощью C#. Я следовал this и this. Вот моя функция, чтобы загрузить надстройку: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

Вы заглянули в управляемую расширяемую платформу? Microsoft уже написала для вас довольно приличную систему плагинов ;-) –

+0

Почти все случаи «NullReferenceException» одинаковы. См. «[Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)» для некоторых советов. –

ответ

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) нуль, для того, чтобы потерпеть неудачу, а более изящно и с более подробной информацией.

Кроме того, вы должны начинать следовать соглашениям об именах .NET - давать имена методов в PascalCase. О, и вам может потребоваться рассмотреть общий интерфейс для ваших надстроек, а не полагаться на отражение методов вызова.