C# 插件架构

C# 插件架构,c#,asp.net,C#,Asp.net,我试图理解插件架构。特别是在Windows Live Writer的实现中使用的。我指的是只需添加/删除DLL(+config)即可配置/启用/禁用/添加/删除其他功能的样式 我希望在基于web的应用程序中看到类似的东西。谁能给我指一下正确的方向吗 提前谢谢 -SK基本上,您需要在运行时使用AssemblyLoader从指定目录加载程序集,然后创建实例并调用它 Assembly assembly = Assembly.LoadFrom("myAssembly.dll"); Typ

我试图理解插件架构。特别是在Windows Live Writer的实现中使用的。我指的是只需添加/删除DLL(+config)即可配置/启用/禁用/添加/删除其他功能的样式

我希望在基于web的应用程序中看到类似的东西。谁能给我指一下正确的方向吗

提前谢谢


-SK

基本上,您需要在运行时使用AssemblyLoader从指定目录加载程序集,然后创建实例并调用它

    Assembly assembly = Assembly.LoadFrom("myAssembly.dll");
    Type type = assembly.GetType("theType");
    object myInstance = Activator.CreateInstance(type);
如果您的所有插件都实现了一个公开特定方法的接口,比如Load(),那么效果最好。然后你可以做:

myInstance.Load()
如果您将myInstance强制转换到您的界面上。

请看这个。简而言之,您需要在高级别上执行以下操作

  • 定义插件必须实现的接口
  • 为插件DLL创建具有特定权限的子目录
  • 定义一个配置节或文件,指定要从插件dll动态加载的类型
  • 使用AppDomain将dll从插件配置和目录加载到安全的沙盒中

  • 我希望这能有所帮助。

    插件的自动检测,只需添加一个DLL,就可以封装在System.Addin命名空间中。每次重新启动程序时,它都会添加/删除给定的插件。如您所见,它不会在程序仍在运行时添加/删除插件。如果需要该功能,则需要通过添加自己的文件事件机制来扩充System.Addin代码,该机制会通知您添加或删除了DLL。当然,如果您想删除某个正在执行的DLL,该DLL上不能有文件锁。要实现这一点,您需要在打开每个DLL的情况下执行。

    您的问题被标记为ASP.NET,但我在您的问题中没有看到任何特定于ASP.NET的内容。可插拔ASP.NET是可能的,但难以使用System.AddIn,又名MAF。我设法在大约4天内创建了一个安全的网站,即概念验证插件

    最酷的事情是最终能够以最小信任度运行外接程序dll,而主机应用程序以完全或中等信任度运行

    我最终得出结论,System.AddIn的创建是为了解决Microsoft Office面临的AddIn难题,而不是为web.app创建AddIn的难题


    MEF应该是新的有光泽的东西来做添加类型模式,但我没有任何经验。MEF是一种通用的解决方案,而不仅仅是解决MS Office团队的问题,因此它在某种程度上更有希望。

    问题在于它会带来安全风险。最好使用
    AppDomain
    加载到沙箱中。MEF不会取代MAF。MEF是关于可扩展性的,MAF是关于隔离性的。