程序集加载与反射
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)); } } } }