C# - Определение версии файла (dll\exe) без загрузки

C# Определение версии библиотеки не загружая в память приложения

Условия: dll или exe в byte[]
Задача: определить версию библиотеки\приложения

Решение 1:
Загрузить библиотеку через Assembly.Load и определить версию
Минусы:
Библиотеку нельзя выгрузить, если требуется загружать много разных библиотек все они останутся "навечно" в памяти приложения

Решение 2:
static string GetVersion(byte[] rawdll)
        {
            string name;
            AppDomain appDomain = AppDomain.CreateDomain("MyDomain");
            try
            {
                Assembly assembly = appDomain.Load(rawdll);
                name = assembly.FullName;
            }
            catch (Exception e)
            {
                name = e.Message ;
                var s = name.Split('"');
                name = s[1];
            }
            AppDomain.Unload(appDomain);
            return name;
        }
Минусы:
Загрузка домена и обработка ошибки занимает время (около 30 мс), что в некоторых задачах слишком долго.
Плюсы:

  • Одининаково быстро работает вне зависимости от размера библиотеки
  • Выгружается из памяти

Решение 3:
static string GetVersionFast(byte[] rawdll)
        {
            string name="";
            string result = System.Text.Encoding.UTF8.GetString(rawdll);
            result = result.Replace("\0","");
            result = result.Substring(result.IndexOf("Assembly Version"));
            foreach (char c in result)
            {
                if (Char.IsDigit(c) | c=='.')
                {
                    name += c;
                }
            }
            return name;
        }
Минусы:
Большой файл будет дольше обрабатываться
Плюсы:

  • Выгружается из памяти
  • Работает быстро (менее 1 мс для типовой простой библиотеки)

Комментарии

Популярные сообщения