将插件DLL存储在/ Plugin文件夹而不是/ Bin中是否可以?

时间:2011-09-22 15:31:52

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

我有一个非常直截了当的问题。

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

感谢您的帮助。

更新

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

我将使用Reflection加载插件。

示例代码:

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;
    }
}

1 个答案:

答案 0 :(得分:4)

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

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

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

如果你对这种方法不满意,你可以随时在bin目录中部署插件程序集。