1

我正在为我正在使用 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. 有一个 System.NullReferenceException

我做错了什么?

4

1 回答 1

2

这个:

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

正在寻找具有命名空间限定名称的类型App.

您的类型App在 的命名空间中被调用,返回也是App如此,然后您将取消引用它。相反,您应该使用:Assembly.GetTypenull

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

但是,您不应该一开始就给一个类赋予与其命名空间相同的名称。解决这个问题,这样你最终会得到更像:

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

您仍然应该检查GetType(或GetMethod)是否返回 null,以便更优雅地失败并提供更多信息。

此外,您应该开始遵循 .NET 命名约定 - 在 PascalCase 中给出方法名称。哦,您可能希望为您的加载项考虑一个通用接口,而不是依赖反射来调用方法。

于 2013-02-19T14:03:53.137 回答