程序集加载与反射

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary2
{
    public class a
    { }
    public interface IAddIn
    {
        string DoSomething(int x);
    }

    public sealed class AddInA : IAddIn
    {

        public string DoSomething(int x)
        {
            return "AddInA" + x.ToString();
        }
    }

    public sealed class AddInB : IAddIn
    {

        public string DoSomething(int x)
        {
            return "AddInB" + (x * 2).ToString();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Reflection;
using System.IO;
using AddInLibrary;
using ClassLibrary2;
namespace AddInLibrary
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            GetAddInTypes();
        }

        public void GetAddInTypes()
        {
            var a = Assembly.LoadFrom(@"E:\ClassLibrary2.dll");
            string AddInDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
            var AddInAssemblies = Directory.EnumerateFiles(AddInDir, "*.dll");
            #region 方法1
            //var AddInTypes = from file in AddInAssemblies
            //                 let assembly = Assembly.LoadFrom(file)
            //                 from t in assembly.ExportedTypes
            //                 let interfaces =t.GetInterfaces()
            //                 where t.IsClass && interfaces.ToList().Contains(typeof(IAddIn))
            //                 select t;
            #endregion
            #region 方法2
            //var AddInTypes = from file in AddInAssemblies
            //                 let assembly = Assembly.LoadFrom(file)
            //                 from t in assembly.ExportedTypes
            //                 let interfaces = t.GetInterfaces()
            //                 where t.IsClass && t.GetInterface("IAddIn")!=null
            //                 select t;
            #endregion
            var AddInTypes = from file in AddInAssemblies
                             let assembly = Assembly.LoadFrom(file)
                             from t in assembly.ExportedTypes
                             let interfaces = t.GetInterfaces()
                             where t.IsClass && typeof(IAddIn).IsAssignableFrom(t)
                             select t;
            foreach (Type t in AddInTypes)
            {
                IAddIn ai = (IAddIn)Activator.CreateInstance(t);
                dog.Items.Add(ai.DoSomething(5));
            }
        }
    }
}

 

posted on 2017-08-12 09:48  苹果园dog  阅读(136)  评论(0编辑  收藏  举报

导航