NSIS中判断.net framework 是否安装

在网上找了几个脚本,原理都是读取注册表进行判断,都可以用。

1、CheckDotNetFramework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * Name: CheckDotNetFramework.nsh
 * Version: 0.1
 * Date: 20110720
 *
 * Author: Michael Mefford
 * Contact info: meffordm@gmail.com
 *
 * Description: NSIS header file to check a windows system for a specified .NET
 *              framework.  CheckDotNetFramework.nsh uses the NSIS stack to
 *              receive and pass values.
 *
 * Modified from: http://nsis.sourceforge.net/How_to_Detect_any_.NET_Framework
 *
 * License: Copyright (C) 2011  Michael Mefford
 *
 *          This software is provided 'as-is', without any express or implied
 *          warranty. In no event will the author(s) be held liable for any
 *          damages arising from the use of this software.
 *
 *          Permission is granted to anyone to use this software for any
 *          purpose, including commercial applications, and to alter it and
 *          redistribute it freely, subject to the following restrictions:
 *
 *             1. The origin of this software must not be misrepresented;
 *                you must not claim that you wrote the original software.
 *                If you use this software in a product, an acknowledgment in
 *                the product documentation would be appreciated but is not
 *                required.
 *
 *             2. Altered versions must be plainly marked as such,
 *                and must not be misrepresented as being the original software.
 *
 *             3. This notice may not be removed or altered from any
 *                distribution.
 *
 * Usage: Push ${DotNetFrameworkVersion}
 *        Call CheckDotNetFramework
 *        Exch $R0
 *        StrCmp $R0 "0" found not_found
 *
 * Algorithm: ...
 *
 * Input: A .NET Framework version.  This must be verbatim, including major,
 *        minor, and build version - i.e.
 *
 *          1.1.4322
 *          2.0.50727
 *          3.0
 *          3.5
 *          4
 *          4.0
 *          .
 *          .
 *          .
 *          etc.
 *
 * Output: "0" if the requested .Net Framework version IS FOUND
 *         "1" if the requested .NET Framework version IS NOT FOUND
 *
 */
 Function CheckDotNetFramework
 
  /* Exchange $R0 with the top of the stack to get the value passed by caller */
  Exch $R0
 
  /* Save other NSIS registers */
  Push $R1
  Push $R2
  Push $R3
 
  /* Zero out $R2 for the indexer */
  StrCpy $R3 "0"
 
loop:
  /* Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" */
  EnumRegKey $R1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $R3
  StrCmp $R1 "" version_not_found  /* Requested version is not found */
 
  StrCpy $R2 $R1 "" 1              /* Remove "v" from subkey */
  StrCmp $R2 $R0 version_found     /* Requested version is found */
 
  IntOp $R3 $R3 + 1                /* Increment registry key index */
  Goto loop
 
/* The requested .Net Framework version WAS NOT FOUND on this system */
version_not_found:
  /* Restore the registers saved earlier */
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
 
  Push "1"  /* Put "1" on the top of the stack for caller to use */
  Goto end
 
/* The requested .Net Framework version WAS FOUND on this system */
version_found:
  /* Restore the registers saved earlier */
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
 
  Push "0"  /* Put "0" on the top of the stack for caller to use */
end:
 
FunctionEnd<br><br> ;检查是否安装了3.5
  StrCpy $DotNetFrameworkVersion 3.5
    Push $DotNetFrameworkVersion
  Call CheckDotNetFramework
  Exch $R0
  ${If} $R0 == "1" ; 没有找到
     MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES
         abort
  ${ElseIf} $R0 == "0" ; 找到指定版本的DotNetFramework
        ;检查是否安装了4.0
        pop $DotNetFrameworkVersion
            StrCpy $DotNetFrameworkVersion 4.0
            Push $DotNetFrameworkVersion
            Call CheckDotNetFramework
        Exch $R0
        ${If} $R0 == "1"
                MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES
                abort
        ${EndIf}
  ${Endif}
Function GetNetFrameworkVersion
    ;获取.Net Framework版本支持
    Push $1
    Push $0
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
    StrCmp $1 "" +1 +2
    StrCpy $1 "2.0.50727.832"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
    StrCmp $1 "" +1 +2
    StrCpy $1 "1.1.4322.573"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
    StrCmp $1 "" +1 +2
    StrCpy $1 "1.0.3705.0"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    StrCpy $1 "not .NetFramework"
    KnowNetFrameworkVersion:
    Pop $0
    Exch $1
FunctionEnd

使用方法: 

  

2、GetNetFrameworkVersion

  

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Call GetNetFrameworkVersion
  Pop $1
  ${If} $1 < '2.0.50727'
  MessageBox MB_OK "正在安装 .NET Framework..."
  SetDetailsPrint textonly
  DetailPrint "正在安装 .NET Framework..."
  SetDetailsPrint listonly
 
  SetOutPath "$TEMP"
  SetOverwrite on
  ;File "NetFx20SP2_x86.exe"
  ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1
  Delete "$TEMP\NetFx20SP2_x86.exe"
  ${EndIf}

  

  

3、封装成宏

这种方式不用在脚本中添加函数代码,复用性好,有两个缺点:1)不能在一个脚本中调用多次进行多个版本的判断;2)参数中必须传入DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR,如果想查4或者4.0版本,脚本中会变成4.或者4.0.,造成找不到,需要改写一下这个脚本,限于目前自己的水平,还改不了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
!macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATH
    Var /GLOBAL DOTNET1
    Var /GLOBAL DOTNET2
    Var /GLOBAL DOTNET3
    Var /GLOBAL DOTNET4
    Var /GLOBAL DOTNET5
    Var /GLOBAL DOTNET6
    Push $DOTNET1
    Push $DOTNET2
    Push $DOTNET3
    Push $DOTNET4
    Push $DOTNET5
    Push $DOTNET6
 
    StrCpy $DOTNET1 "0"
    StrCpy $DOTNET2 "SOFTWARE\Microsoft\.NETFramework"
    StrCpy $DOTNET3 0
 
    DotNetStartEnum:
        EnumRegKey $DOTNET4 HKLM "$DOTNET2\policy" $DOTNET3
         
        StrCmp $DOTNET4 "" noDotNet dotNetFound
 
    dotNetFound:
        StrCpy $DOTNET5 $DOTNET4 1 0
        StrCmp $DOTNET5 "v" +1 goNextDotNet
        StrCpy $DOTNET5 $DOTNET4 1 1
 
        IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg
    StrCpy $DOTNET5 $DOTNET4 1 3
     
        IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg
        StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg   yesDotNetReg
        ;StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1
        ;Changed this line (otherwise it would not work with my setup!) - Vinz0r
 
    IntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg
 
    goNextDotNet:
        IntOp $DOTNET3 $DOTNET3 + 1
        Goto DotNetStartEnum
 
    yesDotNetReg:
        EnumRegValue $DOTNET3 HKLM "$DOTNET2\policy\$DOTNET4" 0
        StrCmp $DOTNET3 "" noDotNet
        ReadRegStr $DOTNET5 HKLM $DOTNET2 "InstallRoot"
        StrCmp $DOTNET5 "" noDotNet
        StrCpy $DOTNET5 "$DOTNET5$DOTNET4.$DOTNET3\mscorlib.dll"
        IfFileExists $DOTNET5 yesDotNet noDotNet
 
    noDotNet:
        StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2
            MessageBox MB_YESNO|MB_ICONQUESTION \
            "You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \
            IDYES +2 IDNO +1
            Abort
            ExecWait '${DOTNETPATH}'
            Goto DotNetStartEnum
    nDN2:
        StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3
            MessageBox MB_YESNO|MB_ICONQUESTION \
            "Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \
            IDYES +1 IDNO +3
            ExecWait '${DOTNETPATH}'
            Goto DotNetStartEnum
            StrCpy $DOTNET1 0
            Goto DotNetFinish
    nDN3:
        StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4
            MessageBox MB_OK|MB_ICONEXCLAMATION \
            "Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \
            IDOK 0
            StrCpy $DOTNET1 0
            Goto DotNetFinish
    nDN4:
        StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5
            MessageBox MB_OK|MB_ICONEXCLAMATION \
            "Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \
            IDOK 0
            Abort
    nDN5:
        StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6
            StrCpy $DOTNET1 0
            Goto DotNetFinish
    nDN6:
        MessageBox MB_OK \
        "$(^Name) Setup internal error.$\nMacro 'DotNetSearch', parameter '4'(${DOTNETLASTFUNCTION})invalid.$\nValue must be INSTALL_ABORT|INSTALL_NOABORT|WARNING|ABORT|IGNORE$\nSorry for the inconvenience.$\n$\tAborting..." \
        IDOK 0
        Abort
 
    yesDotNet:
        StrCpy $DOTNET1 1
 
    DotNetFinish:
        Pop $DOTNET6
        Pop $DOTNET5
        Pop $DOTNET4
        Pop $DOTNET3
        Pop $DOTNET2
        !define ${DOTNETOUTCOME} $DOTNET1
        Exch $DOTNET1
!macroend

  

posted @   伸手不见五趾  阅读(4188)  评论(2编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示