2008-11-01 18 views
8

एमएसआई भविष्य के अनइंस्टॉल कार्यों के लिए स्थापना निर्देशिका संग्रहीत करता है।स्थापना निर्देशिका कैसे प्राप्त करें?

INSTALLPROPERTY_INSTALLLOCATION संपत्ति का उपयोग ("InstallLocation") केवल इंस्टॉलर ने इंस्टॉलेशन के दौरान ARPINSTALLLOCATION संपत्ति सेट की है। लेकिन यह संपत्ति वैकल्पिक है और लगभग कोई इसका उपयोग नहीं करता है।

मैं स्थापना निर्देशिका कैसे पुनर्प्राप्त कर सकता हूं?

उत्तर

2

अपनी इंस्टॉल निर्देशिका का ट्रैक रखने के लिए एक रजिस्ट्री कुंजी का उपयोग करें, इस तरह आप उत्पाद को अपग्रेड और हटाने के दौरान इसका संदर्भ दे सकते हैं।

Wix का उपयोग कर मैं एक घटक है कि कुंजी बनाता है, सही स्थापित निर्देशिका के directy टैग के बाद बन जाएगा, घोषणा

+0

मैंने इसे नहीं किया है, इसलिए मुझे अभी भी यह जानने की ज़रूरत है कि निर्देशिका कैसे प्राप्त करें ... –

+0

आप एमएसआई फ़ाइल बनाने के लिए क्या उपयोग कर रहे हैं, प्रत्येक भाषा में यह जानकारी प्राप्त करने के लिए यह विनिर्देश होगा – CheGueVerra

+0

I ' मैंने इसे इंस्टॉलशील्ड 11.5 के साथ बनाया है (मुझे पता है कि यह पुराना है ...)। बेसिकएमएसआई परियोजना। –

0

मैं Installer.OpenProduct (ProductCode) का उपयोग करने की कोशिश करेंगे। यह एक सत्र खोलता है, जिस पर आप संपत्ति ("TARGETDIR") के लिए पूछ सकते हैं।

+1

पहले से ही करने की कोशिश की: काम नहीं करता है –

0

इस प्रयास करें:। वर sPath = this.Context.Parameters [ "assemblypath"] ToString();

0

मैं MsiGetComponentPath() का उपयोग करता हूं - आपको ProductId और ComponentId की आवश्यकता होती है, लेकिन आपको इंस्टॉल की गई फ़ाइल का पूरा पथ मिलता है - बस अपनी स्थापना निर्देशिका के स्थान पर जाने वाला एक चुनें। यदि आप किसी भी यादृच्छिक एमएसआई के लिए निर्देशिका का मूल्य प्राप्त करना चाहते हैं, तो मुझे विश्वास नहीं है कि एक एपीआई है जो आपको ऐसा करने देती है।

0

जैसा कि धागे में कहीं और कहा गया है, मैं आमतौर पर एचकेएलएम में एक रजिस्ट्री कुंजी लिखता हूं ताकि बाद के इंस्टॉलेशन के लिए इंस्टॉलेशन निर्देशिका को आसानी से पुनर्प्राप्त किया जा सके।

मामलों जब मैं एक सेटअप है कि ऐसा नहीं किया गया है के साथ काम कर रहा हूँ में, मैं का उपयोग में निर्मित Windows इंस्टालर सुविधा AppSearch: http://msdn.microsoft.com/en-us/library/aa367578(v=vs.85).aspx पिछले निर्देशिका एक फ़ाइल हस्ताक्षर के लिए देखने के लिए निर्दिष्ट करने के द्वारा स्थापित पता लगाने के लिए।

फ़ाइल हस्ताक्षर में फ़ाइल का नाम, फ़ाइल आकार और फ़ाइल संस्करण और अन्य फ़ाइल गुण शामिल हो सकते हैं। प्रत्येक हस्ताक्षर को लचीलापन की एक निश्चित डिग्री के साथ निर्दिष्ट किया जा सकता है ताकि आप एक ही फ़ाइल के विभिन्न संस्करणों को उदाहरण के लिए देख सकें, उदाहरण के लिए संस्करण श्रेणी निर्दिष्ट करके। SDK दस्तावेज़ की जांच करें: http://msdn.microsoft.com/en-us/library/aa371853(v=vs.85).aspx

ज्यादातर मामलों में मैं मुख्य आवेदन EXE का उपयोग करें और सही संस्करण और तारीख के साथ फ़ाइल के एक संकीर्ण संस्करण श्रृंखला के लिए देख कर एक तंग हस्ताक्षर निर्धारित किया है।

0

हाल ही में मुझे Ketarin के माध्यम से स्थापित करने की आवश्यकता है। मुझे लगता है कि यह डिफ़ॉल्ट पथ (%ProgramFiles(x86)%\Natural Docs) में स्थापित किया गया था, लेकिन मैंने एक सुरक्षित दृष्टिकोण लेने का फैसला किया। अफसोस की बात है, भले ही इंस्टॉलर ने HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall पर एक कुंजी बनाई, भले ही इसका कोई भी मूल्य मुझे स्थापित डीआईआर ढूंढने के लिए प्रेरित न करे।

स्टीन उत्तर ऐपशर्च एमएसआई फ़ंक्शन का सुझाव देता है, और यह दिलचस्प लग रहा है, लेकिन दुख की बात है कि प्राकृतिक डॉक्स एमएसआई इंस्टॉलर अपने दृष्टिकोण कार्यों में हस्ताक्षर तालिका प्रदान नहीं करता है।

इसलिए मैंने प्राकृतिक डॉक्स इंस्टॉल डीआईआर के किसी भी संदर्भ को खोजने के लिए रजिस्ट्री के माध्यम से खोज करने का निर्णय लिया, और मुझे HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components कुंजी में से एक मिला।

MSI Components Registry Key

मैं Ketarin के लिए सी # कि प्रत्यावर्तन की अनुमति देता है में एक रेग कक्षा का विकास किया।तो मैं HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components के माध्यम से सभी मानों को देखता हूं और यदि मुख्य अनुप्रयोग निष्पादन योग्य (NaturalDocs.exe) उपकुंजी मानों में से एक में पाया जाता है, तो यह निकाला जाता है (C:\Program Files (x86)\Natural Docs\NaturalDocs.exeC:\Program Files (x86)\Natural Docs बन जाता है) और यह सिस्टम पर्यावरण चर% PATH% में जोड़ा गया है (इसलिए मैं कॉल कर सकता हूं " NaturalDocs.exe "सीधे पूर्ण पथ का उपयोग करने के बजाय)।

रजिस्ट्री "वर्ग" (काम करता है, वास्तव में) GitHub (RegClassCS) पर पाया जा सकता।

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("NaturalDocs.exe", "-h"); 
startInfo.UseShellExecute = false; 
startInfo.CreateNoWindow = true; 

var process = System.Diagnostics.Process.Start (startInfo); 
process.WaitForExit(); 

if (process.ExitCode != 0) 
{ 
    string Components = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components"; 

    bool breakFlag = false; 

    string hKeyName = "HKEY_LOCAL_MACHINE"; 
    if (Environment.Is64BitOperatingSystem) 
    { 
     hKeyName = "HKEY_LOCAL_MACHINE64"; 
    } 

    string[] subKeyNames = RegGetSubKeyNames(hKeyName, Components); 
    // Array.Reverse(subKeyNames); 
    for(int i = 0; i <= subKeyNames.Length - 1; i++) 
    { 
     string[] valueNames = RegGetValueNames(hKeyName, subKeyNames[i]); 
     foreach(string valueName in valueNames) 
     { 
      string valueKind = RegGetValueKind(hKeyName, subKeyNames[i], valueName); 
      switch(valueKind) 
      { 
       case "REG_SZ": 
       // case "REG_EXPAND_SZ": 
       // case "REG_BINARY": 
        string valueSZ = (RegGetValue(hKeyName, subKeyNames[i], valueName) as String); 
        if (valueSZ.IndexOf("NaturalDocs.exe") != -1) 
        { 
         startInfo = new System.Diagnostics.ProcessStartInfo("setx", "path \"%path%;" + System.IO.Path.GetDirectoryName(valueSZ) + "\" /M"); 
         startInfo.Verb = "runas"; 

         process = System.Diagnostics.Process.Start (startInfo); 
         process.WaitForExit(); 

         if (process.ExitCode != 0) 
         { 
          Abort("SETX failed."); 
         } 

         breakFlag = true; 
        } 
        break; 

       /* 
       case "REG_MULTI_SZ": 
        string[] valueMultiSZ = (string[])RegGetValue("HKEY_CURRENT_USER", subKeyNames[i], valueKind); 

        for(int k = 0; k <= valueMultiSZ.Length - 1; k++) 
        { 
         Ketarin.Forms.LogDialog.Log("valueMultiSZ[" + k + "] = " + valueMultiSZ[k]); 
        } 
        break; 
       */ 

       default: 
        break; 
      } 

      if (breakFlag) 
      { 
       break; 
      } 
     } 

     if (breakFlag) 
     { 
      break; 
     } 
    } 
} 

भले ही आप Ketarin का उपयोग नहीं करते, आप आसानी से समारोह पेस्ट और विजुअल स्टूडियो या CSC के माध्यम से निर्माण कर सकते हैं।

RegClassVBS का उपयोग करके एक और सामान्य दृष्टिकोण लिया जा सकता है जो रजिस्ट्री कुंजी रिकर्सन की अनुमति देता है और .NET Framework प्लेटफ़ॉर्म या निर्माण प्रक्रियाओं पर निर्भर नहीं करता है।

कृपया ध्यान दें कि अवयव कुंजी की गणना करने की प्रक्रिया सीपीयू तीव्र हो सकता है। उदाहरण के ऊपर एक लंबाई पैरामीटर है, कि आप उपयोगकर्ता के लिए कुछ प्रगति (शायद "(subKeysName.Length से मैं - 1) कुंजी शेष" - की तरह कुछ रचनात्मक होना) को दिखाने के लिए उपयोग कर सकते हैं। RegClassVBS में एक समान दृष्टिकोण लिया जा सकता है।

दोनों वर्गों (RegClassCS और RegClassVBS) प्रलेखन और उदाहरण है कि आप मार्गदर्शन कर सकते हैं, और आप किसी भी सॉफ्टवेयर में इसका इस्तेमाल करते हैं और उनमें से विकास में योगदान कर सकते हैं एक Git रेपो पर प्रतिबद्ध रही है, और (बेशक) एक खोलने यदि आपको कोई समस्या है जो आप स्वयं को हल नहीं कर पा रहे हैं तो इस गिटब पृष्ठों पर समस्याएं ताकि हम इस मुद्दे को पुन: उत्पन्न करने का प्रयास कर सकें ताकि हम यह जान सकें कि हम इसके बारे में क्या कर सकते हैं। =)

संबंधित मुद्दे