Получение версии сборки без загрузки в .NET Compact Framework - PullRequest
3 голосов
/ 27 мая 2011

В приложении .NET Compact Framework 3.5 я делаю проверку версии в довольно узком цикле, чтобы узнать, нужно ли «обновлять» другую сборку (скопировать поверх нее новую копию в другой каталог,затем запустите его снова).

Проблема в том, что Assembly.LoadFrom(path).GetName().Version блокирует файл и предотвращает повторное копирование.

AssemblyName.GetAssemblyName(path) будет лучшим способомполучите это (благодаря этому SO-ответу ), так как он не загружает сборку постоянно в AppDomain и, следовательно, не блокирует файл, но он недоступен в Compact Framework.

Я мог бы создать новый AppDomain, но не могу использовать метод Load нового домена, поскольку он не поддерживается в Compact Framework.

В качестве последнего средстваЯ подумал, что позволю загружать сборку на самом деле с перегрузкой Assembly.Load(byte[]), что приведет к большой "утечке" памяти в узком цикле, поскольку они никогда не выгружаются.Чтобы противостоять этому, я намеревался сначала хэшировать байтовый массив сборки и проверить кэш версий для предыдущего попадания.Тем не менее, как вы уже догадались, перегрузка байтового массива для Assembly.Load() не поддерживается в Compact Framework.

Я также рассмотрел добавление AssemblyFileVersions, так как их проще проверить в любом случае,но это еще одна вещь в растущей куче вещей, не поддерживаемых в Compact Framework (моя благодарность этому SO-ответу за то, что мне не пришлось пробовать это).

Пожалуйста, скажите мне, что я 'я пытаюсь сделать это возможно, поэтому я перестал так сильно ненавидеть этот фреймворк?

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Я думаю, вам придется P / Invoke GetFileVersionInfo, GetFileVersionInfoSize и VerQueryValue, чтобы получить то, что вы хотите. Сайт pinvoke.net - отличный инструмент для подписей и примеров таких вещей. У них есть прототип GetFileVersionInfo, но нет других. Дайте мне знать, если вам нужна помощь с ними, и я, вероятно, смогу получить подписи, которые будут работать.

http://pinvoke.net/default.aspx/coredll/GetFileVersionInfo.html

Также заметил, что библиотека OpenNETCF реализована в классе OpenNETCF.Diagnostics.FileVersionInfo. Таким образом, вы можете скачать эту библиотеку и посмотреть, как они это сделали.

1 голос
/ 10 февраля 2016

вы можете получить эту информацию, используя Mono.Cecil , как упомянул Firo, вот фрагмент кода F #:

open Mono.Cecil

let getAssembly (filename: string) =
  AssemblyDefinition.ReadAssembly(filename)

let getVersion (assembly: AssemblyDefinition) =
  let versionAttributeTypeName = typeof<AssemblyFileVersionAttribute>.FullName
  match assembly.CustomAttributes.FirstOrDefault(fun f ->f.AttributeType.FullName = versionAttributeTypeName) with
  | null -> None
  | a -> Some (a.ConstructorArguments.First().Value :?> string)

getAssembly @"path to assembly"
|> getVersion

вывод из FSI

val getAssembly : filename:string -> AssemblyDefinition
val getVersion : assembly:AssemblyDefinition -> string option
val it : string option = Some "15.2.4.0"
1 голос
/ 19 октября 2011

есть Mono.Cecil из проекта Mono, который проверяет сборки, не загружая их.Я думаю, что вы можете распространять и использовать, чтобы проверить сборку версии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...