反射读取 DLL 并将其添加到接口类型的列表中
本文关键字:接口类型 列表 添加 读取 DLL 反射 | 更新日期: 2023-09-27 18:31:59
我有一个ITemp类型的列表。ITemp是一个接口。
List<ITemp> temp = new List<ITemp>();
现在我要做的是从特定文件位置读取所有dll并将其添加到此临时列表中所以我正在做的是这样的:
List<Assembly> allAssemblies = new List<Assembly>();
string path = Path.GetDirectoryName("C:''TemplatesDLL''");
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
allAssemblies.Add(Assembly.LoadFile(dll));
}
foreach (Assembly assembly in allAssemblies)
{
var DLL = Assembly.LoadFile(assembly.Location.ToString());
foreach (var t in DLL.GetTypes())
{
Activator.CreateInstance(t);
var constructors = t.GetConstructors();
temp.Add(t.GetConstructors()); // here I have to add all the dll that implements ITemp interfaces
}
}
添加这样的接口,如果它在同一项目中
temp.Add(new TestTemp());
这里 TestTemp 是同一项目中的 C# 文件。现在我把这个TestTemp移到DLL文件中。并从同一应用程序中读取它并添加到列表中。
提前谢谢。
我明白了。
List<Assembly> allAssemblies = new List<Assembly>();
string path = Path.GetDirectoryName("C:''TemplatesDLL''");
List<ITemp> temp = new List<ITemp>();
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
allAssemblies.Add(Assembly.LoadFile(dll));
}
foreach (Assembly assembly in allAssemblies)
{
var DLL = Assembly.LoadFile(assembly.Location.ToString());
Type[] types = DLL.GetTypes();
if (typeof(ITemp).IsAssignableFrom(types[0]))
{
temp.Add(Activator.CreateInstance(types[0]) as ITemp); //adding all the instance into the list that is what I was looking for.
}
}
我最近实际上需要这样做。 此示例仅获取第一种类型,但您可以轻松地对其进行修改以返回列表并迭代列表。
var dll = Assembly.LoadFile(@"C:'SimplePlugin.dll");
Type pluginType = dll.GetExportedTypes()
.Where(t => typeof(SimplePluginContracts.ISomePlugin).IsAssignableFrom(t)
&& !t.IsInterface).First();
SimplePluginContracts.ISomePlugin plugin =
(SimplePluginContracts.ISomePlugin)Activator.CreateInstance(pluginType);
这个问题涵盖了这方面的变化,顶部答案很好地讨论了我的简单示例无法处理的这种技术的细微差别:
获取实现接口的所有类型
您还可以考虑过滤掉非公共类,以防您的 DLL 具有一些不打算加载的类,这些类也实现接口。