gpt4 book ai didi

metadata - 自动检索 EXE 文件版本以嵌入 NSIS 安装程序元数据

转载 作者:行者123 更新时间:2023-12-04 09:32:50 24 4
gpt4 key购买 nike

我试图通过从我的可执行文件(在本例中为 .NET 应用程序)中自动检索版本控制信息,在我的应用程序发布过程中再删除一个步骤。

到目前为止,我对 NSIS 的了解有限,但我很快意识到这还不够。

第 1 步:在可执行文件 中声明版本信息

在 AssemblyInfo.cs 中,我声明 [assembly: AssemblyVersion("1.0.0.1")] .这成功地使版本信息出现在编译的可执行文件中(在“文件版本”和“产品版本”下)。

第 2 步:从可执行文件 中检索版本信息

根据这个article on "GetFileVersion" ,导入“FileFunc.nsh”允许您从可执行文件中检索版本信息。

使用的代码:

Section
Var /GLOBAL version
${GetFileVersion} "C:\test.exe" $version
...
SectionEnd

第三步:验证函数调用内容

基于 section 5.1.7 of the documentation ,我应该能够在编译期间使用“!echo”命令打印到命令行。打印变量(或常量等)的内容之间的差异仍然让我感到困惑,所以我尝试了所有四个选项:
!echo $version
!echo "$version"
!echo "${version}"
!echo ${version}

这导致:
$version (InstallScript.nsi:15)
$version (InstallScript.nsi:16)
${version} (InstallScript.nsi:17)
${version} (InstallScript.nsi:18)

第 4 步:声明安装程序元数据

基于 section 4.8.3 ,我应该能够通过 VIProductVersion 添加安装程序元数据和 VIAddVersionKey .
VIProductVersion $version 
VIAddVersionKey "FileVersion" "$version"

在构建的安装程序中,这会将字符串“$version”添加到指定的字段中。

有没有 ToString()相当于 NSIS?如何访问变量的内容?变量名的打印是否意味着它没有内容?我如何验证 GetFileVersion被正确调用,正确执行,并返回一个值?

最佳答案

编辑:NSIS v3 现在包含一个 !getdllversion 预处理器指令,如果您仍在使用 NSIS v2,则只需要 GetVersionLocal 解决方法。

在 NSIS 2.47 中有一个 !getdllversionlocal 的计划,现在你必须使用这个解决方法:

outfile test.exe
requestexecutionlevel user

!macro GetVersionLocal file basedef
!verbose push
!verbose 1
!tempfile _GetVersionLocal_nsi
!tempfile _GetVersionLocal_exe
!appendfile "${_GetVersionLocal_nsi}" 'Outfile "${_GetVersionLocal_exe}"$\nRequestexecutionlevel user$\n'
!appendfile "${_GetVersionLocal_nsi}" 'Section$\n!define D "$"$\n!define N "${D}\n"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'GetDLLVersion "${file}" $2 $4$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $1 $2 / 0x00010000$\nIntOp $2 $2 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'IntOp $3 $4 / 0x00010000$\nIntOp $4 $4 & 0x0000FFFF$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileOpen $0 "${_GetVersionLocal_nsi}" w$\nStrCpy $9 "${N}"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}1 $1$9"$\nFileWrite $0 "!define ${basedef}2 $2$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileWrite $0 "!define ${basedef}3 $3$9"$\nFileWrite $0 "!define ${basedef}4 $4$9"$\n'
!appendfile "${_GetVersionLocal_nsi}" 'FileClose $0$\nSectionend$\n'
!system '"${NSISDIR}\makensis" -NOCD -NOCONFIG "${_GetVersionLocal_nsi}"' = 0
!system '"${_GetVersionLocal_exe}" /S' = 0
!delfile "${_GetVersionLocal_exe}"
!undef _GetVersionLocal_exe
!include "${_GetVersionLocal_nsi}"
!delfile "${_GetVersionLocal_nsi}"
!undef _GetVersionLocal_nsi
!verbose pop
!macroend

!insertmacro GetVersionLocal "$%windir%\Explorer.exe" MyVer_
VIProductVersion "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"
VIAddVersionKey "FileVersion" "${MyVer_1}.${MyVer_2}.${MyVer_3}.${MyVer_4}"

page instfiles
section
sectionend

这个宏:
  • 创建临时 .nsi 文件
  • 将临时 .nsi 编译为临时可执行文件
  • 运行临时 .exe
  • 删除两个文件(.nsi 和 .exe)
  • 返回一个包含指定可执行文件版本信息的数组。
  • 关于metadata - 自动检索 EXE 文件版本以嵌入 NSIS 安装程序元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8188637/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com