【问题标题】:Get assembly or dll by class name or type C#通过类名或类型 C# 获取程序集或 dll
【发布时间】:2015-02-19 21:20:26
【问题描述】:

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

我想创建一个可以键入诸如“#include System.IO;”之类的方法当它在此类文件变量的文本中看到“路径”类型时。 所以通常我想获取计算机上的所有程序集。我知道有一些大会缓存,但我真的不明白在这种情况下如何使用它。 据我了解,来自 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 调用的方法。

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

【问题讨论】:

  • 为什么要这样做,这样做有什么作用?您可以使用当前应用程序域(参见 AppDomain),获取应用程序运行所在的目录,并获取该目录中的所有程序文件。
  • 从 GAC 加载程序集:stackoverflow.com/a/2279362/4544845
  • 我认为您不需要像 Visual Studio "resolve" 这样的东西,因为它只适用于项目引用的程序集。
  • 这听起来像是你试图让一些编辑器(你自己的或 Visual Studio 可能)搜索你的整个驱动器,以找出当你输入部分路径名时需要添加的包含内容。这是对您问题的正确描述吗?抱歉,我所在的地方 imgur 被屏蔽了,所以我看不到你的图片。
  • 史蒂夫,你说的很对。我知道我应该找到通过自定义调用VS它的命令的方法(工具->自定义->命令->单击上下文菜单并选择编辑器上下文菜单|代码窗口|解决。

标签: c# .net .net-assembly


【解决方案1】:

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

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

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

这是一个相关的代码摘录,可能会有所帮助。它将在命名空间“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
       }
   }
}

链接的项目更智能一点,也没有那么简单。但这是大意。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2023-04-04
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多