2008-12-12 14 views
32

मुझे डीएलएल, Registering an Assembly for COM Interop in a MSI file with the Windows Installer XML toolset. पंजीकृत करने पर एक उदाहरण मिला, और वाईएक्स "असेंबली रजिस्ट्रारकॉमइंटरॉप" विशेषता के बारे में शिकायत करता है।आप Win32 COM DLL फ़ाइल को WiX 3 में कैसे पंजीकृत करते हैं?

मैंने इसे हटा दिया और "विधानसभा" विशेषता को Win32 में बदल दिया, और यह कहता है कि मुझे विधानसभा विशेषता विशेषता निर्दिष्ट करने की आवश्यकता है, लेकिन मुझे वहां क्या रखना चाहिए?

उत्तर

39

सबसे आसान तरीका (और रॉब एम इस बारे में बताएगा कि यह गलत) डीएलएल के लिए फ़ाइल टैग पर SelfRegCost=1 का उपयोग करने के लिए है।

यह गलत है, क्योंकि हमें डीएलएल के पंजीकरण को स्पष्ट रूप से नियंत्रित करना चाहिए, इसे डीएलआर रजिस्टर सर्वर के माध्यम से मनमाने ढंग से कोड चलाने की अनुमति नहीं देना चाहिए। सिद्धांत यह है कि डीएलएल रजिस्ट्री में उचित प्रविष्टियों को डालने से परे कुछ भी नहीं करना चाहिए जब DllRegisterServer कहा जाता है। दुर्भाग्यवश, उनमें से बहुत से लोग इससे अधिक करते हैं, इसलिए स्वयं-पंजीकरण आपके काम को स्थापित करने का एकमात्र तरीका हो सकता है।

यह भी गलत है, क्योंकि इसका मतलब है कि विंडोज इंस्टॉलेशन सिस्टम उन रजिस्ट्री कुंजियों के बारे में कुछ नहीं जानता है, और वहां क्या होना चाहिए और क्या नहीं होना चाहिए। इसका मतलब है कि मरम्मत काम नहीं करेगी, और संभवतः अन-इंस्टॉलेशन ठीक से साफ नहीं होगा, आदि

अन्यथा, आप अपने डीएलएल पर heat.exe को इंगित करके उचित वाईएक्स कोड उत्पन्न कर सकते हैं और अपने आउटपुट को अपने वर्तमान वाईएक्स में एकीकृत कर सकते हैं। परियोजना। आपको विभिन्न प्रकार की कक्षा, प्रोगिड, टाइपलिब और रजिस्ट्री टैग मिलेंगे। संकलन करने के लिए आपको उस आउटपुट को मैन्युअल रूप से संपादित करने की आवश्यकता हो सकती है।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

तो मूल रूप से कॉपी/heat.exe से उत्पादन पेस्ट और उचित रास्तों आदि बदलने? – Davy8

+0

मैं उन wxs को रखना पसंद करता हूं जो मुख्य खंडों के संदर्भ में एक खंड में बनाई गई गर्मी डालती हैं। गर्मी में आपके द्वारा चुने गए विकल्प क्या थे, जिन्होंने डीएलएल पंजीकृत नहीं किया था। – CheGueVerra

+0

मुझे आमतौर पर कक्षा टैग और प्रोजेड टैग को फ़ाइल टैग में स्थानांतरित करना होता है, और संभवतः कुछ रजिस्ट्री कुंजियों को संपादित करना होता है। विशेष रूप से, यदि डीएलएल एक .NET DLL है, तो आपको रजिस्ट्री कुंजियों के लिए अद्वितीय आईडी प्रदान करने की आवश्यकता होगी जो mscoree.dll का संदर्भ लें या आपको ऑटो-जेनरेट किए गए लोगों के साथ टक्कर मिल जाएगी। –

23

यह सिर्फ इतना नहीं है कि स्वर्ग के बारे में बुराई कैसे होगी। एमएसआई एसडीके आपको a list of seven reasons why not to use SelfReg देता है।

उदाहरण:

<Component Id="Component" Guid="*"> 
    <File Source="ComServer.dll"> 
     <Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description"> 
      <ProgId Id="Your.Server.1" Description="Your ProgId description"> 
       <ProgId Id="Your.Server" Description="Your ProgId description" /> 
      </ProgId> 
     </Class> 

     <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them"> 
      <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" /> 
      <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" /> 
      <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" /> 
      <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" /> 
     </Class> 
    </File> 
</Component> 

अंत में, ट्रॉय का जवाब सब सही है।

+1

[** स्व-पंजीकरण माना जाता है हानिकारक **] (http://stackoverflow.com/questions/6129816/msi-register-dll-self-registration-cononsidered-harmful/6141538#6141538) (डिजस्ट्रा-एल्यूशन क्षमा करें) । –

13

आप heat.exe प्रोग्राम का उपयोग करने का प्रयास कर सकते हैं, और फिर अपने विक्स कोड में खंड का संदर्भ दे सकते हैं।

heat.exe file <filename> -out <output wxs file> 

में के रूप में:

heat.exe file my.dll -out my.wxs 
+0

-1 विक्स में एक टुकड़े को संदर्भित करने के तरीके के बारे में कोई उदाहरण नहीं है। –

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