.net - 如何在 Windows 注册表中检测用户是否安装了 .Net Framework?

标签 .net registry installation inno-setup

如何在 Windows 注册表中检测用户是否安装了 .Net Framework?我不是在寻找基于 .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;

我检查了注册表,没有 v4.5 文件夹,如果 .Net Framework 4.5 是就地升级,这是有意义的。尽管如此,控制面板程序和功能仍包含该列表。

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

最佳答案

我想分享我编写的实际 Inno Setup 代码,它专门回答了我的问题。感谢之前的回答将我推向正确的方向。

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;

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

文件和运行部分仅包含一个使用 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();

我将明确指出,必须确保首先安装 .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。 future 呢?当.Net 6.0和6.5出现时,只需将4更改为6,除非微软更改公式。看来.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;

关于.net - 如何在 Windows 注册表中检测用户是否安装了 .Net Framework?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828261/

相关文章:

c# - 我可以防止 StreamReader 在使用时锁定文本文件吗?

c# - 线程池抛出异常

.net - 为什么我的 .NET Windows 服务有时不会自动启动?

c - 为 RegSetValueEx() 生成正确的路径

windows - 为什么双击批处理文件找不到要删除的注册表值?

windows-7 - 无法在Windows 7上安装PEAR,结构/图形错误

r - 如果未安装则安装包(库)

c# - 如何使用可选的程序集引用来组织代码?

internet-explorer - 如何让 IE 页面请求存活超过 1 分钟?

installation - 将/SECURITYMODE设置为混合模式以用于SQL Server 2012安装