我正在尝试将插件应用程序实现到我的MVC应用程序中,我已经设法整理了视图引擎,并使用MEf将一个新的控制器从程序集注入到应用程序中。
然而,我试图加载的程序集也有一个强类型模块,我想注入插件应用程序我正在加载程序集如下:
我可以告诉程序集已加载到当前的appdomain但仍然出现以下错误:
编译错误 描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。
编译器错误消息:CS0246:类型或命名空间名称'cars' 无法找到(您是否错过了使用指令或程序集 引用?)
如果你能给我一些暗示,我将不胜感激。
非常感谢。
答案 0 :(得分:2)
您的问题在于包含一个非引用的库,但在您尝试动态加载库的情况下,解决方案是删除using指令。
要正确管理插件,您应该以库的形式公开通用API。 API应该提供足够抽象的接口和类,任何插件都可以使用它们来正确注册自己。它们应该足够暴露以执行您期望或允许的操作(即更改界面,添加处理某些类型内容的方法),但不应暴露大量内部工作或安全信息。
您可以通过两种方式定义插件,可以将它们设置为.exes或.dll。
如果将它们定义为.exes,则可以使它们接受插件API中定义的类,然后用它们进行自我注册。例如:
主程序:
void LoadPlugin(string fullPath)
{
Assembly assembly = Assembly.FromFile(fullPath);
//class that provides methods for registering plugins
IPluginRegistrationService registration = new PluginRegistrationService();
assembly.EntryPoint.Invoke(null,new object[] { registration });
}
插件:
static void main(IPluginRegistrationService registration)
{
//do registration work
//for example:
//registration.RegisterUIPlugin(new UIPluginInfo("plugin name"));
}
如果将它们定义为.dll,程序本身必须搜索并实例化实现定义插件条目的接口/类的类。例如:
MainProgram(主程序):
void LoadPlugin(string fullPath)
{
Assembly assembly = Assembly.LoadFile(file);
foreach (Module module in assembly.GetModules())
{
foreach (Type type in module.GetTypes())
{
if (type.IsSubclassOf(typeof(IPlugin)))
{
//poll constructors and instantiate type
//do work to load plugin based on values
}
}
}
}
插件:
public class CarPlugin : IPlugin
{
//implement IPlugin members to expose
//information such as name
}