【问题标题】:Load assembly into application将程序集加载到应用程序中
【发布时间】:2013-11-30 14:08:34
【问题描述】:

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

但是,我尝试加载的程序集也有一个强类型模块,我想将它注入到插件应用程序中,我正在加载程序集,如下所示:

我可以知道程序集已加载到当前的 appdomain 中,但我仍然收到以下错误:

编译错误 说明:在编译服务此请求所需的资源期间发生错误。请查看以下特定错误详细信息并适当修改您的源代码。

编译器错误消息:CS0246:类型或命名空间名称“cars” 找不到(您是否缺少 using 指令或程序集 参考?)

如果您能给我一些提示,我将不胜感激。

非常感谢。

【问题讨论】:

  • 在什么情况下您会收到提到的错误?
  • 当我使用已从我在应用程序启动时加载的同一个程序集中加载 MEF 的控制器调用视图时出现此错误。基本上这个程序集包含控制器和强类型模块。我用 MEF 和 MefControllerFactory 加载控制器。它工作正常,因此控制器已被 MVC 应用程序识别。但它找不到强类型程序集。希望它有意义。谢谢
  • 您确定路径正确吗?没有驱动器标识符的路径被视为相对路径,因此相对路径可能不是您期望的位置。
  • 感谢 cmets,是的,路径是最新的,因为我可以看到程序集已加载到应用程序域中。只是提到程序集位于 bin 文件夹之外。
  • 如果您动态加载类型,则不需要“使用”命名空间。您可以通过使用其类型对象来创建引用,然后将其转换为它实现/继承的东西来控制类型。为了使编写插件更容易,最好提供一个库/API,其中包含类和接口,供任何插件用于与您的程序进行通信。

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


【解决方案1】:

您的问题在于包含未引用的库,但在您尝试动态加载库时,解决方案是删除 using 指令。

要正确管理插件,您应该以库的形式公开一个通用 API。 API 应该提供足够抽象的接口和类,以便任何插件都可以使用它们来正确注册自己。它们应该暴露足够的信息以执行您期望或允许的操作(即更改界面、添加处理某些类型内容的方法),但不应暴露大量内部工作或安全信息。

有两种方法可以定义插件,可以将它们作为 .exe 或 .dll。

如果你将它们定义为 .exe,你可以让它们接受插件 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,程序本身必须搜索并实例化实现定义插件条目的接口/类的类。示例:

主程序:

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 
}

【讨论】:

  • 非常感谢您的解决方案,非常有帮助。我很感激。
  • 不客气。出于兴趣,这也是一些游戏实现 DLC 的方式。 MVC 似乎严重依赖反射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多