#c_sharp
Мне нужно отобразить список всех сборок в 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();
}
}
Ответы
Ответ 1
Может кому пригодится. По совету Вам поможет пакет Mono.Cecil – Pavel Mayorov Подключил библиотеку и использовал следующий код AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyDescription.Path); Console.WriteLine(assemblyDescription.Name + " " + assembly.MainModule.RuntimeVersion);Ответ 2
У меня работает так без использования доп. библиотек, но получает только лишь версию вида 1.0.5.124: ////// Без выполнения загрузки файла в память (актуально для сборок) возвращает версию файла Filename в переменную /// типа Version если файл существует и возможно получение номера версии. /// Если файл не существует — возвращает null. /// Если номер версии не удается получить для файла, то все поля результата будут нулевыми (0.0.0.0). /// Если имя файла не указано, то возвращает сведения для выполняемой сборки. /// /// путь к файлу для вычисления версии. ///Правильнее и надежнее использовать метод GetFileVersionInfo. public static Version GetFileVersion(string Filename = "") { if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; } if (!File.Exists(Filename)) { return null; } Version version = new Version(); try { FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Filename); version = new Version(vi.ProductVersion); } catch (ArgumentNullException) { //Не можем определить версию файла, и, перемнную для обработки ошибки не ловим, т.к. //её не обрабатываем, а делаем вид, что у файла нулевая версия. version = new Version(0, 0, 0, 0); } return version; } А вот простенький метод, возвращающий больше информации: ////// Возвращает сведения о версии и параметрах файла в переменную класса FileVersionInfo без загрузки файла /// в память (не блокирует файл). /// Если файл не существует, то возвращает null. /// Если имя файла не указано, то возвращает сведения для выполняемой сборки. /// /// Имя файла для получения сведений о версии. ////// Если получить версию файла невозможно (например, для файлов, отличных от EXE и DLL), то возвращает /// практически пустую структуру класса FileVersionInfo БЕЗ генерации ошибки. /// public static FileVersionInfo GetFileVersionInfo(string Filename = "") { if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; } if (!File.Exists(Filename)) { return null; } return FileVersionInfo.GetVersionInfo(Filename); }
Комментариев нет:
Отправить комментарий