使用反射在 DLL C# 中搜索

bri*_*342 4 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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*son 5

像这样的事情应该可以帮助您开始,它将尝试加载当前目录中的所有 .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;
    }
}
Run Code Online (Sandbox Code Playgroud)