2010-11-05 3 views

ответ

68

Функция InitializeSetup вызывается при запуске исполняемого файла Inno Setup. Установка этого кода для пользовательского сценария должен делать то, что вы хотите:

function IsDotNetDetected(version: string; service: cardinal): boolean; 
// Indicates whether the specified version and service pack of the .NET Framework is installed. 
// 
// version -- Specify one of these strings for the required .NET Framework version: 
// 'v1.1'   .NET Framework 1.1 
// 'v2.0'   .NET Framework 2.0 
// 'v3.0'   .NET Framework 3.0 
// 'v3.5'   .NET Framework 3.5 
// 'v4\Client'  .NET Framework 4.0 Client Profile 
// 'v4\Full'  .NET Framework 4.0 Full Installation 
// 'v4.5'   .NET Framework 4.5 
// 'v4.5.1'  .NET Framework 4.5.1 
// 'v4.5.2'  .NET Framework 4.5.2 
// 'v4.6'   .NET Framework 4.6 
// 'v4.6.1'  .NET Framework 4.6.1 
// 'v4.6.2'  .NET Framework 4.6.2 
// 'v4.7'   .NET Framework 4.7 
// 
// service -- Specify any non-negative integer for the required service pack level: 
// 0    No service packs required 
// 1, 2, etc.  Service pack 1, 2, etc. required 
var 
    key, versionKey: string; 
    install, release, serviceCount, versionRelease: cardinal; 
    success: boolean; 
begin 
    versionKey := version; 
    versionRelease := 0; 

    // .NET 1.1 and 2.0 embed release number in version key 
    if version = 'v1.1' then begin 
     versionKey := 'v1.1.4322'; 
    end else if version = 'v2.0' then begin 
     versionKey := 'v2.0.50727'; 
    end 

    // .NET 4.5 and newer install as update to .NET 4.0 Full 
    else if Pos('v4.', version) = 1 then begin 
     versionKey := 'v4\Full'; 
     case version of 
      'v4.5': versionRelease := 378389; 
      'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older 
      'v4.5.2': versionRelease := 379893; 
      'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older 
      'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update 
      'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update 
      'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update 
     end; 
    end; 

    // installation key group for all .NET versions 
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey; 

    // .NET 3.0 uses value InstallSuccess in subkey Setup 
    if Pos('v3.0', version) = 1 then begin 
     success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); 
    end else begin 
     success := RegQueryDWordValue(HKLM, key, 'Install', install); 
    end; 

    // .NET 4.0 and newer use value Servicing instead of SP 
    if Pos('v4', version) = 1 then begin 
     success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); 
    end else begin 
     success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); 
    end; 

    // .NET 4.5 and newer use additional value Release 
    if versionRelease > 0 then begin 
     success := success and RegQueryDWordValue(HKLM, key, 'Release', release); 
     success := success and (release >= versionRelease); 
    end; 

    result := success and (install = 1) and (serviceCount >= service); 
end; 


function InitializeSetup(): Boolean; 
begin 
    if not IsDotNetDetected('v4.6', 0) then begin 
     MsgBox('MyApp requires Microsoft .NET Framework 4.6.'#13#13 
      'Please use Windows Update to install this version,'#13 
      'and then re-run the MyApp setup program.', mbInformation, MB_OK); 
     result := false; 
    end else 
     result := true; 
end; 

(Код взято отсюда: http://www.kynosarges.de/DotNetVersion.html)

Во-первых, он проверяет наличие записи реестра, который указывает версию. NET Framework, который установлен. Если запись реестра отсутствует, она запрашивает у пользователя загрузку платформы .NET. Если пользователь говорит «Да», он открывает URL-адрес загрузки. (Вы, возможно, придется изменить версию он указывает, в сценарии до версии 4.0.)


я наткнулся на this article on CodeProject, что может быть более всеобъемлющий и настраиваемый способ делать то, что вы ищете, хотя он может потребовать больше работы, чтобы понять, и его придется модифицировать для работы с версией 4.0.

+0

Хорошо. Но мне нужно установить фреймворк 4.0 из локального (из моего установочного приложения) – Mediator

+0

Вы должны иметь возможность легко модифицировать приведенный выше сценарий, чтобы сделать это. Вам нужно будет загрузить установщик .NET Framework 4.0 (либо профиль клиента, либо полный, в зависимости от вашего приложения), и включите его в установочный носитель вашего приложения. Затем из сценария вместо выхода в Интернет для извлечения установщика откройте существующий файл установки из исходного каталога установки. Или просто отобразите сообщение, которое просит пользователя сделать это («Сначала запустите приложение« NetFWSetup.exe »). –

+0

«Сначала запустите приложение« NetFWSetup.exe »», а программный инсталлятор не похож на не делать? – Mediator

27

@Cody Grey - Спасибо за ваше решение. Очень полезно!

В случае, если кто-либо заинтересован, здесь я беру на себя его функцию, используя значения перечисления вместо строк. Это изменение - это чисто личное предпочтение. Код включает изменения для v4.5 и, кажется, работает правильно, основываясь на моем ограниченном тестировании.

Дэвид

[Code] 

// 
// Enumeration used to specify a .NET framework version 
// 
type TDotNetFramework = (
    DotNet_v11_4322, // .NET Framework 1.1 
    DotNet_v20_50727, // .NET Framework 2.0 
    DotNet_v30,  // .NET Framework 3.0 
    DotNet_v35,  // .NET Framework 3.5 
    DotNet_v4_Client, // .NET Framework 4.0 Client Profile 
    DotNet_v4_Full, // .NET Framework 4.0 Full Installation 
    DotNet_v45);  // .NET Framework 4.5 

// 
// Checks whether the specified .NET Framework version and service pack 
// is installed (See: http://www.kynosarges.de/DotNetVersion.html) 
// 
// Parameters: 
// Version  - Required .NET Framework version 
// ServicePack - Required service pack level (0: None, 1: SP1, 2: SP2 etc.) 
// 
function IsDotNetInstalled(Version: TDotNetFramework; ServicePack: cardinal): boolean; 
    var 
    KeyName  : string; 
    Check45  : boolean; 
    Success  : boolean; 
    InstallFlag : cardinal; 
    ReleaseVer : cardinal; 
    ServiceCount : cardinal; 
    begin 
    // Registry path for the requested .NET Version 
    KeyName := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\'; 

    case Version of 
     DotNet_v11_4322: KeyName := KeyName + 'v1.1.4322'; 
     DotNet_v20_50727: KeyName := KeyName + 'v2.0.50727'; 
     DotNet_v30:  KeyName := KeyName + 'v3.0'; 
     DotNet_v35:  KeyName := KeyName + 'v3.5'; 
     DotNet_v4_Client: KeyName := KeyName + 'v4\Client'; 
     DotNet_v4_Full: KeyName := KeyName + 'v4\Full'; 
     DotNet_v45:  KeyName := KeyName + 'v4\Full'; 
    end; 

    // .NET 3.0 uses "InstallSuccess" key in subkey Setup 
    if (Version = DotNet_v30) then 
     Success := RegQueryDWordValue(HKLM, KeyName + '\Setup', 'InstallSuccess', InstallFlag) else 
     Success := RegQueryDWordValue(HKLM, KeyName, 'Install', InstallFlag); 

    // .NET 4.0/4.5 uses "Servicing" key instead of "SP" 
    if (Version = DotNet_v4_Client) or 
     (Version = DotNet_v4_Full) or 
     (Version = DotNet_v45) then 
     Success := Success and RegQueryDWordValue(HKLM, KeyName, 'Servicing', ServiceCount) else 
     Success := Success and RegQueryDWordValue(HKLM, KeyName, 'SP', ServiceCount); 

    // .NET 4.5 is distinguished from .NET 4.0 by the Release key 
    if (Version = DotNet_v45) then 
     begin 
     Success := Success and RegQueryDWordValue(HKLM, KeyName, 'Release', ReleaseVer); 
     Success := Success and (ReleaseVer >= 378389); 
     end; 

    Result := Success and (InstallFlag = 1) and (ServiceCount >= ServicePack); 
    end; 
+0

это отлично выглядит, но не могли бы вы также показать, как использовать это из параметра проверки? – vidriduch

+0

Просто добавьте это право после функции выше: 'function IsDotNetReallyInstalled(): Boolean; начало результат: = IsDotNetInstalled (DotNet_v45, 0); end; ' Затем вызовите это в своей функции 'check'. –

+0

Извините меня ... Проверить параметр: Добавить 'not' ... not IsDotNetInstalled –

2

Если вы не заботитесь, если установлен "Full" или просто "Клиент" версия .NET 4:

try 
    ExpandConstant('{dotnet40}'); 
    // Installed 
except 
    // Not installed 
end; 
Смежные вопросы