2011-10-18 9 views
10

पृष्ठभूमि:रजिस्टर Wix दौरान एक .NET COM DLL स्थापित

हमारे आवेदन एक बहुत बड़ा आवेदन के लिए एक प्लगइन है। जो कुछ भी हम बनाते हैं वह डीएलएल फाइलें हैं जो बड़े एप्लिकेशन को हुक करते हैं। इस वजह से हमारे .NET (सी #), डीएलएल फाइलों को एक COM इंटरफ़ेस के लिए पंजीकृत होना चाहिए।

हमारे पास InstallShield प्रोजेक्ट काम कर रहा है, लेकिन कई कारणों से मैं यहां नहीं जाऊंगा, हम इसे WiX पर माइग्रेट करना चाहते हैं। इंस्टॉलर के लिए किया जाने वाला एकमात्र चीज COM के लिए हमारी डीएलएल फाइलों को पंजीकृत करना है।

समस्याएं

यहां एक DLL फ़ाइल के साथ एक नमूना घटक है।

<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" > 
    <File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net" 
      AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" /> 
</Component> 

How do you register a Win32 COM DLL file in WiX 3? के स्वीकार किए जाते हैं जवाब के अनुसार, यह फ़ाइल टैग से SelfRegCost=1 जोड़ने के लिए सिफारिश की है। इसके परिणामस्वरूप इंस्टॉलेशन के दौरान त्रुटि होती है:

मॉड्यूल सी: \ प्रोग्राम फ़ाइलें \ Product \ MyDll.dll पंजीकरण करने में विफल रही। HRESULT-2147024769। अपने समर्थन कर्मियों से संपर्क करें।

ही प्रश्न में दूसरा जवाब (रोब Menshing द्वारा) इस दृष्टिकोण के खिलाफ सिफारिश की गई है, लेकिन फाइल टैग इस अंदर जोड़ने के लिए:

<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> 

मैं थोड़ा उलझन में हूँ के रूप में के रूप में में डालने के लिए सीएलएसआईडी आईडी मैंने जेनरेट किए गए GUID में डाल दिया और इसे इंस्टॉल किया। यह ठीक स्थापित है, लेकिन बड़ा आवेदन DLL फ़ाइलों को नहीं मिला। (मैं heat.exe से उत्पन्न इंटरफ़ेस टैग का इस्तेमाल किया।)

एक और दृष्टिकोण (अदन Tegen द्वारा) एक ही प्रश्न में पाया उपयोग करने की सलाह heat.exe फ़ाइल myDll.dll आउट my.wxs

उत्पादन का उपयोग करना, मैं फ़ाइल टैग से जोड़ें:

<TypeLib Id="Another Guid" Language="0" MagorVersion="1"> 
    <!--Interfaces generated from heat.exe--> 
</TypeLib> 

हर तरह से मैं नेट रजिस्टर करने के लिए कोशिश की है कॉम में विफल रहा है और इस विषय मैं यह कर का सही तरीका जानने के लिए करीब हूँ के बारे में इतने सारे सवालों को पढ़ने के बाद किया है। मुझे क्या करना चाहिए? यह इतना मुश्किल काम क्यों है जब वाईएक्स में बाकी सब कुछ काफी सरल रहा है?

मुझे यह उल्लेख करना चाहिए कि मूल InstallShield प्रोजेक्ट ने एक कस्टम एक्शन बनाया जो regasm.exe पर कॉल करेगा। यदि सब कुछ विफल रहता है तो यह संभावना हो सकती है, लेकिन मैं सही चीजों को सही करता हूं।

मुझे अभी पता चला है कि heat.exe file myDll.dll -scom -o myDll.wxs मुझे आवश्यकतानुसार रजिस्ट्री मानों को आउटपुट करता है। अब, मैं डीएलएल घटक के अंदर नव निर्मित घटक का संदर्भ कैसे दूं?

उत्तर

9

मुझे अभी पता चला है कि heat.exe file myDll.dll -scom -o myDll.wxs मुझे आवश्यकतानुसार रजिस्ट्री मानों को आउटपुट करता है।

क्या आप वाकई -scom के बारे में सुनिश्चित हैं? AFAIK, वह विकल्प वास्तव में COM पंजीकरण दबाने!

अब मैं डीएलएल घटक के अंदर नव निर्मित घटक का संदर्भ कैसे दूं?

heat.exe द्वारा उत्पन्न घटक पहले से ही DLL के लिए एक File तत्व शामिल हैं। तो यह वास्तव में DLL फ़ाइल को स्थापित और पंजीकृत करने के लिए आवश्यक सब कुछ शामिल है। आपको मूल "डीएलएल घटक" की आवश्यकता नहीं है।

यदि आपको फ़ाइल और उसके COM पंजीकरण को अलग-अलग घटकों में रखना है, तो आपको heat.exe द्वारा उत्पन्न घटक से File तत्व को हटाना होगा।

इसके अलावा, घटक अन्य घटकों का संदर्भ नहीं दे सकते हैं। आपके पास ComponentGroup एस के बीच संदर्भ हो सकते हैं, कुछ ऐसा जो हम अपने wixlibs में model dependencies पर भारी रूप से उपयोग करते हैं, लेकिन यह एक उन्नत उपयोग केस है।

+0

तो मेरे में मैं बस जोड़ता हूं? मेरा heat.exe कमांड क्या होना चाहिए? द कॉम एक सुझाव से था जो मुझे गुगलते समय मिला। मैंने सोचा कि COM को दबाकर अजीब था, लेकिन उसने मुझे सीएसएलआईडी दिया जो मुझे उम्मीद थी। heat.exe फ़ाइल myDll.dll -o mydll.wxs? – SaulBack

+0

मैंने "heat.exe फ़ाइल myDll.dll -o mydll.wxs" से आउटपुट का उपयोग किया। धन्यवाद – SaulBack

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