पृष्ठभूमि:रजिस्टर 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
मुझे आवश्यकतानुसार रजिस्ट्री मानों को आउटपुट करता है। अब, मैं डीएलएल घटक के अंदर नव निर्मित घटक का संदर्भ कैसे दूं?
तो मेरे में मैं बस जोड़ता हूं? मेरा heat.exe कमांड क्या होना चाहिए? द कॉम एक सुझाव से था जो मुझे गुगलते समय मिला। मैंने सोचा कि COM को दबाकर अजीब था, लेकिन उसने मुझे सीएसएलआईडी दिया जो मुझे उम्मीद थी। heat.exe फ़ाइल myDll.dll -o mydll.wxs? –
SaulBack
मैंने "heat.exe फ़ाइल myDll.dll -o mydll.wxs" से आउटपुट का उपयोग किया। धन्यवाद – SaulBack