如果用户安装了.Net Framework,如何在Windows注册表中检测?

Sar*_*ger 3 .net registry install inno-setup

如果用户安装了.Net Framework,如何在Windows注册表中检测到?我不是在寻找基于.Net的解决方案,因为查询来自InnoSetup.

我从阅读Stack Overflow上的另一篇文章了解到.Net Framework是4.0的现场升级.

我已经知道如何检查用户是否在系统上安装了4.0版,即通过检查以下内容:

function FindFramework(): Boolean; 
var
 bVer4x0: Boolean;
 bVer4x0Client: Boolean;
 bVer4x0Full: Boolean;
 bSuccess: Boolean;
 iInstalled: Cardinal;
begin
 Result := False;
 bVer4x0Client := False;
 bVer4x0Full := False;


 bVer4x0 := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v4.0'); 
 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4    \Client', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then bVer4x0Client := True;
 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4        \Full', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then bVer4x0Full := True;

 if (True = bVer4x0Full) then begin
    Result := True;
 end;
end;
Run Code Online (Sandbox Code Playgroud)

我检查了注册表,没有v4.5文件夹,如果.Net Framework 4.5是一个就地升级,这是有道理的.不过,控制面板程序和功能还包括列表.

我知道可能"发布dotNetFx45_Full_setup.exe/q"如果在已经有4.5版本的系统上安装会产生不良影响,但如果升级已经存在,我仍然不想安装升级,更快,更少问题.

Sar*_*ger 5

我想分享我写的实际Inno安装代码,它专门回答了我的问题.感谢前面的回答让我朝着正确的方向前进.

function FindFramework45(): Boolean; 
var
 bVer4x5: Boolean;
 bSuccess: Boolean;
 iInstalled: Cardinal;
 strVersion: String;
 iPos: Cardinal;
begin
 Result := False;

 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then
  begin
    bSuccess := RegQueryStringValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Version', strVersion);
    if (True = bSuccess) then
     Begin
        iPos := Pos('4.5.', strVersion);
        if (0 < iPos) then bVer4x5 := True;
     End
  end;

 if (True = bVer4x5) then begin
    Result := True;
 end;
end;
Run Code Online (Sandbox Code Playgroud)

NextButtonClick()事件将在欢迎之后立即调用此函数.

File和Run部分仅包含一个使用Check并检查该变量的函数.

[Run]
Filename: "{app}\dotNetFx45_Full_setup.exe"; Parameters: "/q"; StatusMsg: "Installing Microsoft .Net 4.5 Framework..."; Check: InstallFramework45();

[Files]
Source: "{#MySourceBaseDir}\{#MyAppVersion}\{#MyDirBinaries}\dotNetFx45_Full_setup.exe"; Flags: deleteafterinstall; DestDir: "{app}"; Check: InstallFramework45();
Run Code Online (Sandbox Code Playgroud)

我将明确指出,必须首先确保安装.Net Framework 4.0,然后检查/安装.Net Framework 4.5.

现在,如果System.Data.SQLite.org推出符合Visual Studio 2012的版本,我可以查看我的其他大型升级任务.

更新:2010.10.11(根据TLana的评论)注意:我决定保留原始代码,因为我认为其他人希望看到我开始的地方.下面的代码就是我现在所处的位置.下面的代码也使用正确的注册表位置并检查.Net 4.0和新的.Net 4.5.未来怎么样?当.Net 6.0和6.5出现时,所需要的只是将4更改为6,除非Microsoft更改公式.似乎.5升级不是新框架,而是对现有框架的升级.

[Files]
Source: "{#MySourceBaseDir}\{#MyDirBinaries}\dotNetFx40_Full_x86_x64.exe"; Flags: deleteafterinstall; DestDir: "{app}"; Check: Framework40IsNotInstalled();
Source: "{#MySourceBaseDir}\{#MyDirBinaries}\dotNetFx45_Full_setup.exe"; Flags: deleteafterinstall; DestDir: "{app}"; Check: Framework45IsNotInstalled();
Source: "{#MySourceBaseDir}\{#MyDirBinaries}\mysql-connector-net-6.5.4.msi"; Flags: deleteafterinstall; DestDir: "{tmp}";

[Run]
Filename: "{app}\vcredist_x86.exe"; Parameters: "/q"; StatusMsg: "Installing Microsoft Visual C++ 2010 Redistributable Package...";
Filename: "{app}\dotNetFx40_Full_x86_x64.exe"; Parameters: "/q"; StatusMsg: "Installing Microsoft .Net 4.0 Full Framework..."; Check: Framework40IsNotInstalled();
Filename: "{app}\dotNetFx45_Full_setup.exe"; Parameters: "/q"; StatusMsg: "Installing Microsoft .Net 4.5 Framework..."; Check: Framework45IsNotInstalled();
Filename: "msiexec"; Parameters: "/package ""{tmp}\mysql-connector-net-6.5.4.msi"" /quiet"; StatusMsg: "Installing MySQL Connector...";

[Code]

function Framework40IsNotInstalled: Boolean;
var
 bVer4x0Client: Boolean;
 bVer4x0Full: Boolean;
 bSuccess: Boolean;
 iInstalled: Cardinal;
begin
 Result := True;
 bVer4x0Client := False;
 bVer4x0Full := False;


 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Client', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then bVer4x0Client := True;
 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then bVer4x0Full := True;

 if (True = bVer4x0Full) then begin
    Result := False;
 end;
end;

function Framework45IsNotInstalled: Boolean;
var
 bVer4x5: Boolean;
 bSuccess: Boolean;
 iInstalled: Cardinal;
 strVersion: String;
 iPos: Cardinal;
begin
 Result := True;
 bVer4x5 := False;

 bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Install', iInstalled);
 if (1 = iInstalled) AND (True = bSuccess) then
  begin
    bSuccess := RegQueryStringValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Version', strVersion);
    if (True = bSuccess) then
     Begin
        iPos := Pos('4.5.', strVersion);
        if (0 < iPos) then bVer4x5 := True;
     End
  end;

 if (True = bVer4x5) then begin
    Result := False;
 end;
end;
Run Code Online (Sandbox Code Playgroud)