मैं InnoSetup का उपयोग कर एक शर्त के रूप में.NET फ्रेमवर्क कैसे स्थापित कर सकता हूं?




inno-setup (3)

मेरे पास इनो सेटअप के समान एक प्रश्न है : सत्यापित करें कि .NET 4.0 स्थापित है , लेकिन यह थोड़ा अलग लगता है।

[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; Check: FrameworkIsNotInstalled
Source: "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.5.4.0__c5687fc88969c44d\MySql.Data.dll"; DestDir: "{app}\lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: "gacinstall sharedfile uninsnosharedfileprompt"

[Run]
Filename: {tmp}\dotNetFx40_Full_x86_x64.exe; Description: Install Microsoft .NET Framework 4.0; Parameters: /q /norestart; Check: FrameworkIsNotInstalled

[code]
function FrameworkIsNotInstalled: Boolean;
begin
  Result := not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\.NETFramework\policy\v4.0');
end;

जैसा कि आप देख सकते हैं, मैं GAC के साथ एक फ़ाइल पंजीकृत करने का प्रयास कर रहा हूँ। दुर्भाग्य से कुछ मशीनों पर यह संभव है कि .NET फ्रेमवर्क स्थापित न हो । इसलिए मुझे पहले इसे स्थापित करने की आवश्यकता है। वैसे भी क्या मैं अपनी फाइलों को पंजीकृत करने की कोशिश करने से पहले .NET रनटाइम की स्थापना के लिए मजबूर कर सकता हूं?


.NET फ्रेमवर्क 4.7 के लिए जाँच करने पर मेरा 2 सेंट, @ स्निकर के उत्तर के साथ सही बैठता है:

function FrameworkIsNotInstalled: Boolean;
var
  ver: Cardinal;
begin
  Result :=
    not
    (
    (RegKeyExists(
      HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client')
    and
        RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client', 'Release', ver)
    )
    or
    (RegKeyExists(
      HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full')
    and
        RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', ver)
    )
    )
    and (ver < 460798)
end;

चूंकि [Files] अनुभाग के बाद [Run] अनुभाग को संसाधित किया जाता है, आपके द्वारा दिखाई गई स्क्रिप्ट (इसलिए आपका प्रश्न) के साथ ऐसा करना स्वाभाविक रूप से असंभव है। वहाँ कुछ तरीके हैं जहाँ मैं एक की सिफारिश करेंगे सेटअप प्रविष्टि के AfterInstall पैरामीटर फ़ंक्शन से .NET सेटअप निष्पादित करने के लिए है। तो आप अपने वर्तमान [Run] अनुभाग को हटा देंगे और इस तरह से एक स्क्रिप्ट लिखेंगे:

[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; AfterInstall: InstallFramework; Check: FrameworkIsNotInstalled
Source: "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.5.4.0__c5687fc88969c44d\MySql.Data.dll"; DestDir: "{app}\lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: gacinstall sharedfile uninsnosharedfileprompt

[Code]
procedure InstallFramework;
var
  ResultCode: Integer;
begin
  if not Exec(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    { you can interact with the user that the installation failed }
    MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
      mbError, MB_OK);
  end;
end;

यह प्रक्रिया आसान है, अगर [Files] अनुभाग के .NET सेटअप प्रविष्टि के Check फ़ंक्शन ट्रू ( FrameworkIsNotInstalled ) का मूल्यांकन करता है, तो प्रविष्टि को संसाधित किया जाता है, जो सेटअप बाइनरी को इनो सेटअप के अस्थायी फ़ोल्डर में कॉपी करता है और यदि सफल होता है, तो AfterInstall function InstallFramework को तुरंत बाद कहा जाता है। इस फ़ंक्शन के अंदर, .NET सेटअप मैन्युअल रूप से Exec फ़ंक्शन को कॉल करके निष्पादित किया जाता है।

और अंत में, अगर वह सब सफल हो जाता है, तो इंस्टॉलेशन अगले [Files] खंड प्रविष्टि को संसाधित करना जारी रखता है, जो आपकी असेंबली है जो पंजीकृत होने वाली है। अब, स्थापित .NET फ्रेमवर्क के साथ। इसलिए जैसा कि आप देख सकते हैं, यहां [Files] अनुभाग प्रविष्टियों का क्रम महत्वपूर्ण है।

आपने अतिरिक्त रूप से अपनी टिप्पणी में पूछा है, उपयोगकर्ता को कुछ प्रगति दिखाने के लिए कैसे करें। मैंने यहां पोस्ट किए गए तरीके में .NET सेटअप को निष्पादित करने के बाद [Files] प्रविष्टि को अवरुद्ध कर दिया है, जिसके कारण रुकी हुई प्रगति बार और पाठ दिखाने की ओर जाता है। फ़ाइलों को निकालना। चूंकि .NET सेटअप की इंस्टॉलेशन प्रगति को प्राप्त करना आसान नहीं होगा, इसलिए मैं उस सेटअप निष्पादन के दौरान उपयोगकर्ता को अंतहीन मार्की प्रगति बार दिखाऊंगा।

इस कोड को उस कोड में लपेटने के लिए इस तरह से करें:

procedure InstallFramework;
var
  StatusText: string;
begin
  StatusText := WizardForm.StatusLabel.Caption;
  WizardForm.StatusLabel.Caption := 'Installing .NET framework...';
  WizardForm.ProgressGauge.Style := npbstMarquee;
  try
    { here put the .NET setup execution code }
  finally
    WizardForm.StatusLabel.Caption := StatusText;
    WizardForm.ProgressGauge.Style := npbstNormal;
  end;
end;

यह है कि .NET सेटअप निष्पादन (प्रगति बार एनिमेटेड है) के दौरान विज़ार्ड प्रपत्र कैसा दिखता है:


यदि आप बहुत भारी फुल .NET इंस्टॉलर में पैकेज नहीं करना चाहते हैं तो आप इसे वेब बूटस्ट्रैपर डाउनलोड करने और चलाने के लिए भी सेट कर सकते हैं। मैंने एक ब्लॉग पोस्ट लिखा है कि इनो डाउनलोड प्लगिन के साथ कैसे करें





inno-setup