C# - Определение версии файла (dll\exe) без загрузки
C# Определение версии библиотеки не загружая в память приложения
Условия: dll или exe в byte[]
Условия: 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 мс для типовой простой библиотеки)
Комментарии