Страницы

Поиск по вопросам

суббота, 27 апреля 2019 г.

Узнать версию Runtime для сборки не загружая ее

Мне нужно отобразить список всех сборок в 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);

Комментариев нет:

Отправить комментарий