代码之家  ›  专栏  ›  技术社区  ›  Brandon Boone

在基于Web的插件体系结构中重用加载的程序集。最大化性能

  •  2
  • Brandon Boone  · 技术社区  · 14 年前


    背景

    我正在构建一个基于web的应用程序,动态加载插件。每个插件都附带一个清单文件,其中包含其dll位置、名称空间和类型。

    System.Reflection.Assembly.LoadFile

    作为旁白: 我最后可能会变成 System.Reflection.Assembly.LoadFrom Assembly.Load 或者别的什么),也可以随便加进去

    问题

    问题是多个插件可能从同一个dll运行。所以我最后执行了死刑 System.Reflection.Assembly.LoadFile("Identical.dll")

    我想通过遍历 AppDomain.CurrentDomain.GetAssemblies() ,但我不知道这是否有助于提高性能(或者它是否有效,我还没有尝试过)。

    虽然你可能会说这是一个糟糕的设计:我不能改变它,即使我想或同意你。。。所以请不要急着问这个问题。。。。。。。拜托。。。。。除非你真的有那么强烈的感觉,我想你可以把它作为一个建议 ).

    最终我的目标是:

    1. 不要重新加载同一个程序集两次。
    2. 性能是关键。
    3 回复  |  直到 14 年前
        1
  •  1
  •   Jeff Sternal    14 年前

    如果你使用 LoadFrom AppDomain . 查看MSDN主题和Suzanne Cook的 Choosing a Binding Context 更多细节。

        2
  •  1
  •   Jimmy Hoffa    14 年前

    http://mef.codeplex.com/ 下面是我编写的一个快速示例(尽管我认为您应该寻找[ImportMany]属性,在该属性中,您可以获得每个 http://msdn.microsoft.com/en-us/library/dd460648.aspx#further_imports_and_importmany ):

    namespace MEF_Interface
    {
        // Interface to recognize the concrete implementation as
        public interface IMessageWriter
        {
            void WriteMessage();
        }
    }
    
    namespace MEF_HelloMessageWriter
    {
        // Concrete implementation in another assembly 
        [Export(typeof(IMessageWriter))]
        public class HelloMessageWriter : IMessageWriter
        {
            public void WriteMessage() { Console.WriteLine("Hello!"); }
        }
    }
    
    namespace MEF_GoodbyeMessageWriter
    {
        // Concrete implementation in another assembly 
        [Export(typeof(IMessageWriter))]
        public class GoodbyeMessageWriter : IMessageWriter
        {
            public void WriteMessage() { Console.WriteLine("Goodbye!"); }
        }
    }
    
    namespace MEF_Example
    {
        class DIContainer
        {
            [Import]
            public IMessageWriter MessageWriter { get; set; }
    
            public DIContainer(string directory)
            {
                // all exports in a specified directory. Filtering is also available.
                DirectoryCatalog catalog = new DirectoryCatalog(directory);
                catalog.Refresh();
                var container = new CompositionContainer(catalog);
                container.ComposeParts(this);
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
                string helloMessageWriterPath =
                    @"C:\shared\Projects\MEF_Example\MEF_HelloMessageWriter\bin\Debug";
    
                string goodbyeMessageWriterPath =
                    @"C:\shared\Projects\MEF_Example\MEF_GoodbyeMessageWriter\bin\Debug";
    
                DIContainer diHelloContainer = new DIContainer(helloMessageWriterPath);
                diHelloContainer.MessageWriter.WriteMessage();
    
                DIContainer diGoodbyeContainer = new DIContainer(goodbyeMessageWriterPath);
                diGoodbyeContainer.MessageWriter.WriteMessage();
    
                Console.ReadLine();
            }
        }
    }
    
        3
  •  0
  •   Adam McKee    14 年前

    Spring.Net ? 您可以通过配置指定在运行时加载哪些程序集。它基本上为您处理所有的反射/缓存。