使用反射在DLL中搜索c#

时间:2013-11-27 10:37:47

标签: c# reflection dll

目前我正在使用反射来搜索我的程序集中实现接口的类,然后检查这些类的名称以查看它与搜索的类匹配。

我的下一个任务是在这段代码中添加一种搜索目录中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;
            }
        }

操作码是我正在搜索的类的名称。

2 个答案:

答案 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
    }
}