C# 将程序集加载到应用程序中
我试图在我的MVC应用程序中实现一个插件应用程序,我已经成功地整理了视图引擎,并使用MEf将一个新的控制器从程序集中注入到应用程序中 但是,我尝试加载的程序集也有一个强类型模块,我希望将其注入我加载程序集的插件应用程序中,如下所示: 我可以看出程序集已加载到当前appdomain,但仍然出现以下错误: 编译错误 描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改源代码 编译器错误消息:CS0246:类型或命名空间名称“cars” 找不到(是否缺少using指令或程序集 参考?) 如果你能给我一些提示,我将不胜感激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指令或程序集
非常感谢。您的问题在于包含一个未引用的库,尽管在您尝试动态加载库时,解决方案是删除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似乎严重依赖于反射。