2013-11-27 50 views
2

當前我正在使用反射來搜索我的程序集中實現接口的類,然後檢查這些類的名稱以查看它是否與搜索的類匹配。使用反射在DLL中搜索c#

我的下一個任務是添加到此代碼的方式來搜索目錄中的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; 
      } 
     } 

opcode是一個類im搜索的名稱。

+0

您可以使用[this](http://stackoverflow.com/a/9991947/477878)作爲起點,當然指向您自己的目錄而不是框架程序集dir。 –

+0

@JoachimIsaksson你能否更詳細地解釋你的答案,甚至可以舉個例子?我可以使用 –

回答

3

像這樣的東西應該讓你開始,它會試圖加載所有.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; 
    } 
} 
0

使用Assembly.LoadFile方法上找到dll文件:

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 
    } 
} 
+0

Assembly assembly = Assembly.LoadFile(currentDir); 要搜索多個DLL? –

+0

不,但我已經更新了一個更完整的答案。 –