如何在Windows注册表中检测用户是否已经安装了.NET Framework? 我不是在寻找一个基于.NET的解决方案,因为查询是从InnoSetup。
我知道从这里读另一职务上的堆栈溢出了.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框架4.5是就地升级。 不过,控制面板程序和功能包括上市。
我知道这可能是“发行dotNetFx45_Full_setup.exe / Q”将有如果安装在已有4.5版本的系统无不良影响,但我还是想不安装升级,如果升级已经存在,更快,少的问题。
我想和大家分享的是我写的实际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()事件将欢迎之后调用这个函数。
文件并运行区段仅仅含有使用的检查,并检查该变量的函数。
[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的正确注册表位置和检查。 未来怎么样? 当净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框架版本的安装位置
http://msdn.microsoft.com/en-us/library/hh925568.aspx
如何:确定哪一个.NET框架更新安装
http://msdn.microsoft.com/en-us/library/hh925567.aspx
在这两篇文章中提供的代码工作通过框架的4.5版本。 更新检测代码标识的所有程序更新,安全更新和修补程序。