通过 class 名称或类型 C# 获取程序集或 dll

Get assembly or dll by class name or type C#

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

我想创建一个可以输入类似“#include System.IO;”的方法当它在 class 文件变量的文本中看到类型为 "Path" 时。 所以通常我想获取计算机上的所有程序集。我知道有一些大会缓存,但我真的不明白在这种情况下如何使用它。 据我了解,Assemble 中的方法 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->Click Context menu 调用的方法,然后选择 Editor Context Menus|Code Window|Resolve。

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

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

粘贴到答案中的代码很长,但总体思路是这样的:

  1. 查找所有 .NET DLL 文件
  2. 在每个 DLL 上调用 Assembly.LoadFrom() 或 Assembly.ReflectionOnlyLoad()
  3. 调用 GetExportedTypes() 获取类型列表
  4. 在那里循环查找您感兴趣的class。

以下是可能有用的相关代码摘录。它将在命名空间 "System.IO" 中查找 class "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
       }
   }
}

链接的项目更聪明一些,也没有那么简单。但这是一般的想法。