系统尝试从DLL文件加载函数时出现NullReferenceException-C#

本文关键字:函数 NullReferenceException-C# 加载 文件 DLL 系统 | 更新日期: 2023-09-27 18:00:02

我正在为使用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时,我注意到:

  1. 应用程序未启动
  2. 有一个系统。NullReferenceException

我做什么不对?

系统尝试从DLL文件加载函数时出现NullReferenceException-C#

这:

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中为方法命名。哦,您可能希望为外接程序考虑一个通用接口,而不是依赖反射来调用方法。