目前我正在使用反射来搜索我的程序集中实现接口的类,然后检查这些类的名称以查看它与搜索的类匹配。
我的下一个任务是在这段代码中添加一种搜索目录中DLL文件的方法,我唯一的提示是我可以使用" System.Environment.CurrentDirectory"。我还需要考虑到并非所有DLL都包含.net程序集的事实。
有人可以推荐从哪里开始吗?
IInstruction instruction = null;
string currentDir = Environment.CurrentDirectory;
var query = from type in Assembly.GetExecutingAssembly().GetTypes()
where type.IsClass && type.GetInterfaces().Contains(typeof(IInstruction))
select type;
foreach (var item in query)
{
if (opcode.Equals(item.Name, StringComparison.InvariantCultureIgnoreCase))
{
instruction = Activator.CreateInstance(item) as IInstruction;
return instruction;
}
}
操作码是我正在搜索的类的名称。
答案 0 :(得分:4)
这样的事情应该让你开始,它将尝试加载当前目录中的所有.dll文件,并返回它们包含opcode
中包含短名称的所有类型;
private static IEnumerable<Type> GetMatchingTypes(string opcode)
{
var files = Directory.GetFiles(Environment.CurrentDirectory, "*.dll");
foreach (var file in files)
{
Type[] types;
try
{
types = Assembly.LoadFrom(file).GetTypes();
}
catch
{
continue; // Can't load as .NET assembly, so ignore
}
var interestingTypes =
types.Where(t => t.IsClass &&
t.GetInterfaces().Contains(typeof (IInstruction)) &&
t.Name.Equals(opcode, StringComparison.InvariantCultureIgnoreCase));
foreach (var type in interestingTypes)
yield return type;
}
}
答案 1 :(得分:0)
在找到的dll上使用Assembly.LoadFile
方法:
foreach (var dllPath in Directory.EnumerateFiles(Environment.CurrentDirectory, "*.dll"))
{
try
{
var assembly = Assembly.LoadFile(dllPath);
var types = assembly.GetTypes();
}
catch (System.BadImageFormatException ex)
{
// this is not an assembly
}
}