我正在为使用C#开发的shell创建一个附加系统。我已关注this和this。这是我加载附加组件的功能:
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时,我注意到:
我做得不对?
答案 0 :(得分: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中提供方法名称。哦,您可能想要考虑加载项的通用接口,而不是依靠反射来调用方法。