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

时间:2010-09-22 11:05:57

标签: c#

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

如何在C#中执行此操作。任何人都可以帮我提供示例代码吗?

编辑:如何阅读Legacy dll(外部dll-未在.NET中创建)的详细信息

提前致谢。

6 个答案:

答案 0 :(得分:3)

您应该通过调用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

答案 1 :(得分:1)

我对你真正想要的东西感到有点困惑,但检查大会班:http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您致电AssemblyName.GetAssemblyName,程序集不会加载到您的应用程序域。

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

答案 4 :(得分:0)

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

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

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

最诚挚的问候,
Oliver Hanappi

答案 5 :(得分:0)

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