代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

如何读取程序集的名称和版本

c#
  •  1
  • Thorin Oakenshield  · 技术社区  · 14 年前

    我必须创建一个应用程序来读取我的应用程序路径中所有DLL(程序集)的名称及其版本。以及读取子文件夹中所有dll的相同内容。

    如何在C中执行此操作。有人能帮我做样本代码吗?

    编辑 :如何读取旧版DLL的详细信息(外部DLL-不是在.NET中创建的)

    事先谢谢。

    6 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    8 年前

    您应该通过调用 Directory.GetFiles() . 通过调用 Assembly.ReflectionOnlyLoadFrom() (因为如果您以这种方式加载它,它将不会被添加到AppDomain,而不需要卸载)。

    带着这些 Assembly 可以访问的类 GetName() 函数并查看 Version 属性以获取版本信息。

    其他不容易获得的属性可以通过 GetCustomAttribute() 功能如下:

    ((AssemblyCopyrightAttribute)assembly.GetCustomAttribute(typeof(AssemblyCopyrightAttribute), true).Copyright
    

    有了这些信息,你应该能够建立起你喜欢的清单。

    更新:

    下面是必需的LINQ代码示例:

    var rootPath = @"C:\MyRoot\Folder";
    
    var query = Directory.GetFiles(rootPath, "*.dll", SearchOption.AllDirectories)
                         .Select(fileName =>
                         {
                             try
                             {
                                 return Assembly.ReflectionOnlyLoadFrom(fileName);
                             }
                             catch
                             {
                                 return null;
                             }
                         })
                         .Where(assembly => assembly != null)
                         .Select(assembly => new
                         {
                             Version = assembly.GetName().Version.ToString(),
                             Name = assembly.GetName().Name
                         });
    
    foreach (var infos in query)
    {
        Console.WriteLine(infos.Name + "   " + infos.Version);
    }
    

    更新2:

    所以从 正常的 你应该检查一下DLL this question .

        2
  •  1
  •   Lloyd    14 年前

    我对你真正想要的有点困惑,但请检查汇编类: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

        3
  •  1
  •   Andrey    14 年前

    使用 Assembly.Load . 有一个问题,你不能卸载它,所以如果你做了太多次,你的内存将被垃圾填满。

        4
  •  1
  •   Mattias S    14 年前

    如果你打电话 AssemblyName.GetAssemblyName ,程序集未加载到AppDomain中。

    要包含子文件夹,您可能需要编写递归函数。 Directory.GetDirectories DirectoryInfo.GetDirectories 可用于检索所有子文件夹。

        5
  •  0
  •   Oliver Hanappi    14 年前

    使用 Assembly.GetName() 要获取对象,可以从中提取程序集版本,因为程序集名称的一部分是其版本。

    如上所述,一个组件 Assembly.Load 无法卸载,因此将保留在内存中。但是,您可以创建一个单独的 AppDomain ,您可以再次卸载。通过传递可序列化对象,可以在AppDomain之间进行数据传输,这对您来说没有问题,因为您只想传递一个字符串。

    如果您实际上想要在可扩展应用程序的上下文中加载程序集,请看一下 MEF .

    顺祝商祺!
    奥利弗·哈纳皮

        6
  •  0
  •   abatishchev Karl Johan    14 年前

    使用 Assembly.ReflectionOnlyLoadFrom 如果不需要从该程序集中执行任何代码,并且只希望收集有关包含在该程序集中的成员的一些信息。