Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将程序集加载到应用程序中_C#_Asp.net Mvc_Mef_Strong Typing_Strongly Typed View - Fatal编程技术网

C# 将程序集加载到应用程序中

C# 将程序集加载到应用程序中,c#,asp.net-mvc,mef,strong-typing,strongly-typed-view,C#,Asp.net Mvc,Mef,Strong Typing,Strongly Typed View,我试图在我的MVC应用程序中实现一个插件应用程序,我已经成功地整理了视图引擎,并使用MEf将一个新的控制器从程序集中注入到应用程序中 但是,我尝试加载的程序集也有一个强类型模块,我希望将其注入我加载程序集的插件应用程序中,如下所示: 我可以看出程序集已加载到当前appdomain,但仍然出现以下错误: 编译错误 描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码 编译器错误消息:CS0246:类型或命名空间名称“cars” 找不到(是否缺少using指令或程序集

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

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

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

编译错误 描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码

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

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


非常感谢。

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

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

有两种方法可以定义插件,一种是.exes,另一种是.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"));
}
public class CarPlugin : IPlugin
{
//implement IPlugin members to expose
//information such as 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
}
}
}
}
插件:

static void main(IPluginRegistrationService registration)
{
//do registration work
//for example:
//registration.RegisterUIPlugin(new UIPluginInfo("plugin name"));
}
public class CarPlugin : IPlugin
{
//implement IPlugin members to expose
//information such as name 
}

在什么情况下您会收到提到的错误?我在使用控制器调用视图时遇到此错误,该控制器已从应用程序启动时加载的同一程序集中加载MEF。基本上,此程序集包含控制器和强类型模块。我用MEF和MefControllerFactory加载控制器。该控制器工作良好,已被MVC应用程序所认可。但它找不到强类型程序集。希望它有意义。谢谢你确定路径正确吗?没有驱动器标识符的路径被视为相对路径,因此可能是相对路径不是您期望的路径。感谢您的评论,是的,路径是当前路径,因为我可以看到程序集已加载到应用程序域中。请注意,程序集位于bin文件夹之外。如果动态加载类型,则不需要“使用”命名空间。通过使用类型对象创建引用,然后将其强制转换为它实现/继承的对象,可以控制该类型。为了使编写插件更容易,最好提供一个库/API,其中包含类和接口,供任何插件用于与程序通信。非常感谢您提供的解决方案,这非常有帮助。非常感谢,不客气。出于兴趣,这也是一些游戏实现DLC的方式。MVC似乎严重依赖于反射。