3

ユーザーが.NetFrameworkをインストールしているかどうかをWindowsレジストリで検出するにはどうすればよいですか?クエリはInnoSetupからのものであるため、.Netベースのソリューションを探していません。

Stack Overflowに関する別の投稿を読んだことで、.NetFrameworkは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フォルダーがありません。これは、.NetFramework4.5がインプレースアップグレードである場合に意味があります。それでも、コントロールパネルのプログラムと機能にはリストが含まれています。

すでにバージョン4.5がインストールされているシステムにインストールする場合、おそらく「dotNetFx45_Full_setup.exe / qを発行する」ことによる悪影響はないことはわかっていますが、アップグレードがすでに存在する場合は、アップグレードをインストールしないでください。

4

2 に答える 2

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() イベントは、ウェルカムの直後にこの関数を呼び出します。

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();

最初に.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 が出てきたら、Microsoft が式を変更しない限り、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;
于 2012-10-10T22:25:52.327 に答える
1

方法:インストールされている.NETFrameworkのバージョンを確認する
http://msdn.microsoft.com/en-us/library/hh925568.aspx

方法:インストールされている.NETFrameworkの更新プログラムを確認する
http://msdn.microsoft.com/en-us/library/hh925567.aspx

これらの2つの記事で提供されているコードは、フレームワークのバージョン4.5で機能します。更新検出コードは、すべての定期的な更新、セキュリティ更新、および修正プログラムを識別します。

于 2012-10-10T21:07:38.827 に答える