Мне нужно отобразить список всех сборок в GAC, а так же их RuntimeVersion.
Если делать так:
Assembly.ReflectionOnlyLoadFrom(systemAssemblyModel.Path).ImageRuntimeVersion;
то пямять забивается на лишние 80 мб и непонятно как их очистить.
Если же загружать сборки полностью и затем выгружать ее вместе с доменом. То проиcходит OutOfMemoryException
internal class Program
{
static void Main(string[] args)
{
var appDomain = AppDomain.CreateDomain("TestDomain");
appDomain.DoCallBack(() => LoadModule());
var worker = (Worker) appDomain.CreateInstanceAndUnwrap(typeof (Worker).Assembly.FullName, typeof (Worker).FullName);
var a1 = worker.GetAssembliesFullName();
foreach (var assemblyFullName1 in a1)
{
Console.WriteLine(assemblyFullName1);
}
Console.WriteLine();
var a2 = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly1 in a2)
{
Console.WriteLine(assembly1.FullName);
}
AppDomain.Unload(appDomain);
Console.ReadKey();
}
private static void LoadModule()
{
foreach (var systemAssemblyModel in AssemblyLoader.LoadAssemblies())
{
try
{
var version = Assembly.Load(systemAssemblyModel.Desc.Path).ImageRuntimeVersion;
}
catch (Exception)
{
}
}
}
}
class Worker : MarshalByRefObject
{
public string[] GetAssembliesFullName()
{
return AppDomain.CurrentDomain.GetAssemblies().Select(a => a.FullName).ToArray();
}
}
Ответ
Может кому пригодится. По совету
Вам поможет пакет Mono.Cecil – Pavel Mayorov
Подключил библиотеку и использовал следующий код
AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyDescription.Path);
Console.WriteLine(assemblyDescription.Name + " " + assembly.MainModule.RuntimeVersion);
Комментариев нет:
Отправить комментарий