2012-09-19 12 views
5

कहें, अगर मेरे पास एक एमएसआई इंस्टॉलेशन फ़ाइल है, तो क्या मैं इसे इंस्टॉल किए बिना सी # या सी ++ प्रोग्राम से अपनी सामग्री निकाल सकता हूं?क्या मैं सीएस ++ या सी # प्रोग्राम के भीतर से एमएसआई पैकेज की सामग्री निकाल सकता हूं?

उत्तर

7
डॉक है

आमतौर पर आप एक एमएसआई की सामग्री निकालने के लिए Administrative installation perforrm कर सकते हैं।

msiexec /a foo.msi TARGETDIR=C:\EXTRACTHERE /qn 

आप इस प्रक्रिया के बाहर जाने के लिए आप MsiInstallProduct function के माध्यम से एमएसआई के साथ सीधे Interop कर सकते हैं नहीं करना चाहते हैं।

szPackagePath [में] एक शून्य-समाप्त स्ट्रिंग जो Windows इंस्टालर पैकेज के स्थान के पथ को निर्दिष्ट करता है। स्ट्रिंग मान में एक यूआरएल नेटवर्क पथ, एक फ़ाइल पथ (उदा। फ़ाइल: //packageLocation/package.msi), या एक स्थानीय पथ (उदा। डी: \ पैकेज स्थान \ package.msi) हो सकता है।

szCommandLine [में] एक नल-टर्मिनेटेड स्ट्रिंग जो कमांड लाइन प्रॉपर्टी सेटिंग्स निर्दिष्ट करती है। यह संपत्ति = सेटिंग संपत्ति = सेटिंग प्रारूप की एक सूची होनी चाहिए। अधिक जानकारी के लिए, गुणों के बारे में देखें।

प्रशासनिक स्थापना करने के लिए, szCommandLine में ACTION = ADMIN शामिल करें। अधिक जानकारी के लिए, ACTION गुण देखें।

ध्यान दें कि जब आप स्वयं को पी/घोषित कर सकते हैं, तो वास्तव में अच्छी तरह से अच्छी है .NET इंटरऑप लाइब्रेरी Windows Instaler XML के साथ उपलब्ध है जिसे डिप्लॉयमेंट टूल्स फाउंडेशन (डीटीएफ) कहा जाता है। माइक्रोसॉफ्ट। डिप्लॉयमेंट। विन्डोज़ इंस्टालर नेमस्पेस में इंस्टालर नामक एक क्लास विधि है जो इंस्टॉल प्रोडक्ट नामक एक स्थिर विधि का खुलासा करती है। यह MsiInstallProduct का प्रत्यक्ष encapsulation है।

डीटीएफ पुस्तकालयों का उपयोग करके आप Win32 एपीआई पर कुरूपता से छिपाते हैं और सही ढंग से IDISposable लागू करते हैं जहां यह सुनिश्चित करने के लिए आवश्यक है कि अंतर्निहित अप्रबंधित हैंडल आवश्यक हो।

इसके अतिरिक्त डीटीएफ में माइक्रोसॉफ्ट है। डिप्लॉयमेंटविंडोव्स इंस्टालर। इंस्टालपैकेज क्लास के साथ पैकेज नामस्थान। यह वर्ग ExtractFiles() नामक एक विधि का खुलासा करता है जो फ़ाइलों को कार्यशील निर्देशिका में निकालता है। कोड का एक उदाहरण इस तरह दिखता है:

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Deployment.WindowsInstaller.Package; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using(var package = new InstallPackage(@"C:\test.msi", DatabaseOpenMode.ReadOnly)) 
      { 
       package.ExtractFiles(); 
      } 
     } 
    } 
} 
+0

इस देरी के लिए धन्यवाद और खेद है। अगर यह एएसपी.नेट वेब ऐप से उपलब्ध है तो बस उत्सुक है? – c00000fd

+0

मुझे नहीं लगता कि क्यों नहीं। –

+0

क्षमा करें, अगर मैं कुछ बहुत सरल पूछ रहा हूं। जब मैं आपकी दो 'उपयोग' लाइनों को शामिल करता हूं, तो मुझे यह मिलता है: "त्रुटि CS0234: नाम या नामस्थान नाम 'परिनियोजन' नामस्थान 'माइक्रोसॉफ्ट' में मौजूद नहीं है (क्या आप एक असेंबली संदर्भ खो रहे हैं?)" – c00000fd

4

एक एमएसआई फ़ाइल COM structured storage है। यह मूल रूप से एक डेटाबेस है। आप MSDN पर कुछ विस्तृत प्रलेखन पा सकते हैं:

  • Here डेटाबेस API है
  • Here आप एक यौगिक बाइनरी फ़ाइल स्वरूप
  • Here के बारे में कुछ जानकारी मिल सकती है के बारे में Windows इंस्टालर
+0

धन्यवाद। हालांकि यह मेरे लिए इस बिंदु पर सब बहुत जबरदस्त है ... सी # कोड के लिए कोई लिंक जो निष्कर्षण कर सकता है? – c00000fd

+1

@ user843732, [इस परियोजना] की जांच करें (http://code.google.com/p/lessmsi/) – SingerOfTheFall

+2

वह सिर्फ सामग्री को निकालने के बारे में जानना चाहता है। उसके लिए एपीआई है। उसे बाइनरी स्तर पर डेटाबेस संरचना को समझने की आवश्यकता नहीं है। –

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