Ответ 1
Попробуйте сопоставить номера версий, охватывающие целую строку:
$ strings file.exe | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
В моих (нескольких) тестах двоичный код AssemblyVersion
всегда был последним.
Есть ли способ получить AssemblyVersion исполняемого файла .Net в Linux без использования моно? То, что я пытаюсь сделать, это script или команда, которая позволит мне получить AssemblyVersion в Linux. Я попытался:
#strings file.exe | grep AssemblyVersion
но это только строка, а не номер. Также проверяется с помощью: #file file.exe
, но получает только общую информацию.
Любые идеи?
Попробуйте сопоставить номера версий, охватывающие целую строку:
$ strings file.exe | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
В моих (нескольких) тестах двоичный код AssemblyVersion
всегда был последним.
Как рекомендовано Jb Evain, вы можете использовать Mono Disassembler.
monodis --assembly file.exe | grep Version
Инструмент ikdasm
, который также распространяется с Mono, более надежен, чем monodis
, который, к сожалению, вылетает с сообщением "Ошибка сегментации: 11" во многих файлах DLL. ikdasm
явно рекомендуют использовать ikdasm
а не monodis
: https://github.com/mono/mono/issues/8900#issuecomment-428392112
Пример использования (со сборкой, которую monodis
настоящее время не может обработать):
ikdasm -assembly System.Runtime.InteropServices.RuntimeInformation.dll | grep Version:
Это действительно старый вопрос, и почти все изменилось, но начиная с 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
}