将组件加载到应用程序

时间:2013-11-17 12:22:42

标签: c# asp.net-mvc mef strong-typing strongly-typed-view

我正在尝试将插件应用程序实现到我的MVC应用程序中,我已经设法整理了视图引擎,并使用MEf将一个新的控制器从程序集注入到应用程序中。

然而,我试图加载的程序集也有一个强类型模块,我想注入插件应用程序我正在加载程序集如下:

enter image description here

我可以告诉程序集已加载到当前的appdomain但仍然出现以下错误:

编译错误   描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。

  

编译器错误消息:CS0246:类型或命名空间名称'cars'   无法找到(您是否错过了使用指令或程序集   引用?)

如果你能给我一些暗示,我将不胜感激。

非常感谢。

1 个答案:

答案 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 
}