【问题标题】:Is it ok to store plugin DLLs in a /Plugin folder instead of /Bin?可以将插件 DLL 存储在 /Plugin 文件夹而不是 /Bin 中吗?
【发布时间】:2011-09-22 15:31:51
【问题描述】:

我有一个非常简单的问题。

可以将插件 DLL 存储在 /Plugin 文件夹而不是 /Bin 中吗?我正在 ASP.NET WebForms(和 MVC)的上下文中尝试插件设计,我想知道将插件 DLL 存储在 /Plugin 文件夹而不是 /Bin 文件夹中是否存在问题。

感谢您的帮助。

更新

我从这篇文章的角度来看这个:http://www.c-sharpcorner.com/UploadFile/40e97e/7192/

我将使用反射加载插件。

示例代码:

public class PluginLoader
{
    public static IList<IPlugin> Load(string folder)
    {
        IList<IPlugin> plugins = new List<IPlugin>();

        // Get files in folder
        string[] files = Directory.GetFiles(folder, "*.plug.dll");
        foreach(string file in files)
        {
            Assembly assembly = Assembly.LoadFile(file);
            var types = assembly.GetExportedTypes();
            foreach (Type type in types)
            {
                if (type.GetInterfaces().Contains(typeof(IPlugin)))
                {
                    object instance = Activator.CreateInstance(type);
                    plugins.Add(instance as IPlugin);
                }
            }
        }
        return plugins;
    }
}

【问题讨论】:

  • 取决于您希望如何在运行时加载它们。您看过 MEF - 托管可扩展性框架吗?
  • 我打算使用反射。前段时间我看过 MEF,但它似乎有点矫枉过正。不过,随着我获得经验,我可能会看到其中的价值 :-)

标签: c# asp.net asp.net-mvc plugins


【解决方案1】:

您通常需要注意的唯一一件事是,当您尝试在视图(或页面)中使用这些插件程序集中的类型时,它们可能无法在运行时解析。这是由于 ASP.NET 用于非预编译应用程序的动态编译模型的性质。

本质上,您的视图(和页面)将由 ASP.NET 运行时动态编译,而不是编译时,因此当程序集绑定器尝试解析这些类型时,因为它们不在默认的 bin 位置,它不会找到它们。一个简单的解决方法是使用AppDomain.CurrentDomain.AppendPrivatePath,传入插件文件夹的路径,例如Server.MapPath("~/plugins")

该方法本身被标记为过时,可能会在框架的未来版本中被删除(通常您会通过AppDomainSetup 配置探测路径),但它确实有效。

如果您对这种方法不满意,您始终可以将插件程序集部署在您的 bin 目录中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 2022-01-28
    • 2011-01-26
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多