从加载的程序集中查找实现接口的对象 – 如何比较类型?

我有一个类将加载目录中的所有程序集,然后获取所有类型,看看它们是否实现了一个接口。 我无法进行类型比较。 在调试器中,如果总是未通过比较,我会看到我的类型已加载(我感兴趣的那个)。 如果我在本地使用相同的比较代码,我没有问题,我得到了预期的结果。 我可以在类型接口上进行sting比较,但我更愿意知道我做错了什么。

测试:

// Fails [Fact] public void FindISerialPortTest() { var path = Directory.GetCurrentDirectory(); var results = FindImplementers.GetInterfaceImplementor(path); results.Length.Should().Be(1); results[0].Should().BeAssignableTo(); } //Passes [Fact] public void DoesTypeImplementInterfaceTest() { var myType = typeof(SerialPortWrapper); var myInterface = typeof(ISerialPort); FindImplementers.DoesTypeImplementInterface(myType, myInterface).Should().Be(true); } 

class级:

  public class FindImplementers { public static T[] GetInterfaceImplementor(string directory) { if (String.IsNullOrEmpty(directory)) { return null; } //sanity check DirectoryInfo info = new DirectoryInfo(directory); if (!info.Exists) { return null; } //make sure directory exists var implementors = new List(); foreach (FileInfo file in info.GetFiles("*.dll")) //loop through all dll files in directory { Assembly currentAssembly = null; Type[] types = null; try { //using Reflection, load Assembly into memory from disk currentAssembly = Assembly.LoadFile(file.FullName); types = currentAssembly.GetTypes(); } catch (Exception ex) { //ignore errors continue; } foreach (Type type in types) { if (!DoesTypeImplementInterface(type, typeof(T))) { continue; } //Create instance of class that implements T and cast it to type var plugin = (T)Activator.CreateInstance(type); implementors.Add(plugin); } } return implementors.ToArray(); } public static bool DoesTypeImplementInterface(Type type, Type interfaceType) { return (type != interfaceType && interfaceType.IsAssignableFrom(type)); } } 

好的 – 这给了我答案: invalidcastexception-when-using-assembly-loadfile

这是更新的课程:

 public class PluginLoader { public static T[] GetInterfaceImplementor(string directory) { if (String.IsNullOrEmpty(directory)) { return null; } //sanity check DirectoryInfo info = new DirectoryInfo(directory); if (!info.Exists) { return null; } //make sure directory exists var implementors = new List(); foreach (FileInfo file in info.GetFiles("*.dll")) //loop through all dll files in directory { Assembly currentAssembly = null; try { var name = AssemblyName.GetAssemblyName(file.FullName); currentAssembly = Assembly.Load(name); } catch (Exception ex) { continue; } currentAssembly.GetTypes() .Where(t => t != typeof(T) && typeof(T).IsAssignableFrom(t)) .ToList() .ForEach(x => implementors.Add((T)Activator.CreateInstance(x))); } return implementors.ToArray(); } }