我必须创建一个应用程序来读取应用程序路径中所有DLL(程序集)的名称及其版本。并且还要读取子文件夹中所有dll的相同内容。
如何在C#中执行此操作。任何人都可以帮我提供示例代码吗?
编辑:如何阅读Legacy dll(外部dll-未在.NET中创建)的详细信息
提前致谢。
答案 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);
}
因此,要从普通 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.GetDirectories或DirectoryInfo.GetDirectories可用于检索所有子文件夹。
答案 4 :(得分:0)
使用Assembly.GetName()获取一个对象,您可以在其中提取程序集版本,因为程序集名称的一部分是其版本。
如上所述,加载Assembly.Load的程序集无法卸载,因此仍保留在内存中。但是,您可以创建一个单独的AppDomain,您可以再次卸载它。通过传递可序列化的对象,可以实现AppDomains之间的数据传输,这对您来说没问题,因为您只想传递一个字符串。
如果您确实想要在可扩展应用程序的上下文中加载程序集,请查看MEF。
最诚挚的问候,
Oliver Hanappi
答案 5 :(得分:0)
如果您不需要执行该程序集中的任何代码,并且只想收集有关其中包含的成员的一些信息,请使用Assembly.ReflectionOnlyLoadFrom 。