Как получить AssemblyVersion .Net-файла в Linux - PullRequest
20 голосов
/ 16 октября 2010

Есть ли способ получить AssemblyVersion исполняемого файла .Net в Linux без использования mono?Я пытаюсь получить сценарий или команду, которые позволят мне получить AssemblyVersion для Linux.Я попробовал:

#strings file.exe | grep AssemblyVersion
но это только строка, а не число.Также проверил:
#file file.exe
, но получил только общую информацию.

Есть идеи?

Ответы [ 4 ]

10 голосов
/ 29 августа 2013

В соответствии с рекомендациями Jb Evain вы можете использовать Моно дизассемблер .

monodis --assembly file.exe | grep Version
10 голосов
/ 16 октября 2010

Попробуйте сопоставить номера версий, которые занимают всю строку:

$ strings file.exe | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'

В моих (нескольких) тестах AssemblyVersion двоичного файла всегда был последним результатом.

2 голосов
/ 19 октября 2018

Инструмент ikdasm, который также распространяется с Mono , более надежен, чем monodis, который, к сожалению, вылетает с сообщением «Ошибка сегментации: 11» во многих файлах DLL.Сопровождающие явно рекомендуют использовать ikdasm вместо monodis: https://github.com/mono/mono/issues/8900#issuecomment-428392112

Пример использования (со сборкой, которую monodis в настоящее время не может обработать):

ikdasm -assembly System.Runtime.InteropServices.RuntimeInformation.dll | grep Version:
1 голос
/ 07 февраля 2019

Это действительно старый вопрос, и почти все изменилось, но в dotnet 2.1 (так что вы можете dotnet tool install) вы можете установить dotnet-ildasm:

dotnet tool install --tool-path . dotnet-ildasm

Тогда вы можете использовать эту функцию:

function dll_version {
  local dll="$1"
  local version_line
  local version

  version_line="$(./dotnet-ildasm "$dll" | grep AssemblyFileVersionAttribute)"
  # Uses SerString format:
  #   01 00 is Prolog
  #   SZARRAY for NumElem
  #   version chars for Elem
  #   00 00 for NamedArgs
  # See:
  #   https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf#%5B%7B%22num%22%3A2917%2C%22gen%22%3A0%7D%2C%7B%22name%22%3A%22XYZ%22%7D%2C87%2C321%2C0%5D
  [[ $version_line =~ \(\ 01\ 00\ [0123456789aAbBcCdDeEfF][0123456789aAbBcCdDeEfF]\ (.*)\ 00\ 00\ \)$ ]]
  dotcount=0
  for i in ${BASH_REMATCH[1]}; do
    if [[ $i =~ ^2[eE]$ ]]; then
      (( dotcount++ ))
    fi
    if (( dotcount == 3 )); then
      break
    fi
    echo -n -e "\u$i"
  done
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...