尝试从DLL文件加载函数时System.NullReferenceException-C#

尝试从DLL文件加载函数时System.NullReferenceException-C#,c#,dll,add-on,system.reflection,C#,Dll,Add On,System.reflection,我正在为使用C#开发的shell创建一个附加系统。我一直在跟踪调查。下面是我加载加载项的函数: public void loadAppFromDLL(string assemblyFile) { Assembly a = Assembly.Load(assemblyFile); Type app = a.GetType("App"); MethodInfo loadMethod = app.GetMethod("load"); object appInstance

我正在为使用C#开发的shell创建一个附加系统。我一直在跟踪调查。下面是我加载加载项的函数:

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!");
        }
    }
}
构建外接程序时,我将其放置在与shell可执行文件相同的目录中,并调用:

LoadExternalApp lea = new LoadExternalApp();
lea.loadAppFromDLL("SampleApp");
(LoadExternalApp包含DLL加载函数)

在调试shell时,我注意到:

  • 应用程序没有启动
  • 出现System.NullReferenceException异常
  • 我做对了什么?

    这:

    Type app = a.GetType("App");
    
    正在查找命名空间限定名为
    App
    的类型

    您的类型在
    App
    的命名空间中被称为
    App
    ,因此
    Assembly.GetType
    将返回
    null
    ,然后您将取消对它的引用。相反,您应该使用:

    Type app = a.GetType("App.App");
    
    然而。解决这个问题,让你最终得到更像:

    Type app = a.GetType("App.PlugIn");
    
    您仍然应该检查
    GetType
    (或
    GetMethod
    )是否返回null,以便更优雅地失败并获得更多信息


    此外,您应该开始遵循.NET命名约定-在PascalCase中指定方法名称。哦,你可能想考虑插件的公共接口,而不是依赖反射来调用方法。

    你查看托管扩展框架吗?微软已经为您编写了一个相当不错的插件系统;-)几乎所有
    NullReferenceException
    的情况都是相同的。有关提示,请参阅“”。