按类名或类型C#获取程序集或dll

时间:2015-02-19 21:20:26

标签: c# .net .net-assembly

我试图找到如何通过我需要使用的类型(通过C#)找到dll或程序集。

我想制作一种方法可以输入类似#34; #include System.IO;"当它在文本中看到这个类文件变量的类型为" Path"。 所以一般来说我想得到计算机上的所有程序集。我知道有一些大会缓存,但在这种情况下我真的不懂如何使用它。 据我所知,汇编中的GetType方法可以正常工作,但是我无法找到所有程序集来使用这种方法。

使用AppDomain的方法没用,因为只使用此解决方案中包含的程序集How to Load an Assembly to AppDomain with all references recursively?get assembly by class name

更具体地说,它是Visual Studio方法Resolve的一些自定义实现 http://i.stack.imgur.com/xNns9.png

据我了解,我应该找到由VS Tools调用的方法 - > Customize-> Commands->单击上下文菜单,然后选择编辑上下文菜单|代码窗口|解析。

对于这个简单的问题很抱歉,但对我来说这很重要。

1 个答案:

答案 0 :(得分:1)

Here是一个工具,它扫描系统上的所有程序集并搜索这些程序集中的所有类,查找某些类型。该工具仅搜索.NET SDK目录,而不是GAC。如果您修改程序以搜索%systemroot%\ assembly文件夹,那么您也应该获得GAC中的类。

代码很长,可以粘贴到答案中,但总体思路是:

  1. 查找所有.NET DLL文件
  2. 在每个DLL上调用Assembly.LoadFrom()或Assembly.ReflectionOnlyLoad()
  3. 调用GetExportedTypes()以获取类型列表
  4. 在那里循环找到你感兴趣的课程。
  5. 以下是可能有用的相关代码摘录。它将在命名空间“System.IO”中查找“File”类,而不知道可能存在的DLL。

    string[] assemblyPaths = System.IO.Directory.GetFiles(@"C:\Windows\Microsoft.NET\", "*.dll", System.IO.SearchOption.AllDirectories);
    foreach (string assemblyPath in assemblyPaths)
    {
       Assembly assembly = null;
       assembly = Assembly.LoadFrom(assemblyPath);
    
       // Go through all the types in it
       foreach (Type t in assembly.GetExportedTypes())
       {
           // Publically creatable exception?
           if (t.IsPublic && t.Name == "File" && t.Namespace == "System.IO")
           {
               // The type "t" is the type you are looking for
           }
       }
    }
    

    链接的项目更加智能,并没有过于简单化。但这是一般的想法。