2009-10-19 29 views
18

मैं एक CustomAction सी # DLL फ़ाइल है कि एक तीसरी पार्टी .NET DLL पर निर्भर करता है बनाना चाहते हैं, के साथ एक WiX कस्टम क्रिया DLL फ़ाइल निष्पादित करने के लिए कैसे (इस विशिष्ट मामले में, यह MySql.Data.dll है)। मेरे पास सी # कस्टम एक्शन डीएलएल फ़ाइल है जो नीचे दिए गए वाईएक्स खंड के साथ काम कर रही है। मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि कैसे कस्टम कार्रवाई के लिए निर्भरता को सुरक्षित रूप से जोड़ना है। नोट: स्थापित करने के लिए इंस्टॉल किए गए एप्लिकेशन के लिए मुझे वास्तव में इस तृतीय-पक्ष DLL फ़ाइल फ़ाइल की आवश्यकता नहीं है।निर्भरता

<Binary Id="MyCustomAction.dll" SourceFile="MyCustomAction.CA.dll" /> 

    <CustomAction Id="FixupConfigForMysql" Return="check" /> 

    <InstallExecuteSequence> 
    <Custom Action='FixupConfigForMysql' After='InstallFiles'>NOT Installed</Custom> 
    </InstallExecuteSequence> 

मैं आदेश कस्टम क्रिया को चलाने के लिए प्राप्त करने के लिए तीसरे पक्ष के DLL फ़ाइल (MySql.Data.dll) स्थापित करने की आवश्यकता है?

क्या मैं तीसरे पक्ष के डीएलएल फ़ाइल के साथ बस एक और बाइनरी टैग जोड़ सकता हूं?

उत्तर

19

वाईएक्स टूलसेट में डीटीएफ में आपकी कस्टम एक्शन असेंबली और इसके सभी संदर्भों को एक बाइनरी (स्वयं निकालने वाला डीएल, मूल रूप से) में शामिल करने के लिए एक तंत्र है। मैं प्रबंधित कस्टम क्रियाओं को नहीं लिखता (सी/सी ++ कम निर्भरताओं के साथ कस्टम क्रियाएं बनाता है और सफलता दर बढ़ाता है) लेकिन यह केवल वीएस में निर्माण करते समय काम करना चाहिए।

+8

यह केवल काम करने के लिए प्रतीत होता है, संभावित रूप से कस्टम एक्शन बिल्ड प्रक्रिया इन निर्भरताओं को जोड़ने में हैंडल करता है। अगर मैं इसे सही ढंग से समझता हूं, तो वे कस्टम एक्शन बिल्ड द्वारा उत्पन्न .CA.dll का हिस्सा बन जाते हैं। http://blogs.msdn.com/jasongin/archive/2008/05/23/custom-action-project-templates.aspx –

+4

@AdamTegen उस लेख को पोस्ट करने के लिए धन्यवाद, मुझे मेरे सिर को टक्कर देने का एक और सप्ताह बचाया दिवार! महत्वपूर्ण पंक्ति यह थी कि "कस्टम एक्शन बिल्ड प्रक्रिया स्वचालित रूप से किसी भी गैर-जीएसीएड असेंबली को पैकेज करेगी, जिस पर आपका सीए निर्भर करता है" मेरे पास मेरे विकास बॉक्स पर जीएसी में मेरी सभी निर्भर असेंबली थीं और यह पता नहीं लगा कि उन्होंने क्यों नहीं किया ' प्रतीत होता है कि परीक्षण बॉक्स पर मौजूद नहीं है। धन्यवाद! –

+2

दूसरों के लिए एक नोट के रूप में, सुनिश्चित करें कि आपका 'बाइनरी' तत्व '.CA.dll' फ़ाइल को इंगित कर रहा है जो WiX उत्पन्न करता है, न कि मूल .NET DLL – Cocowalla

4

कस्टम क्रियाओं को चलाने के लिए जो भी फाइलें आवश्यक हैं, जोड़ने के लिए आप <Binary /> का उपयोग कर सकते हैं। आपको किसी तीसरे पक्ष के डीएल के लिए भी जाना चाहिए जो आपको चाहिए। बाइनरी तत्व का उपयोग करने वाली फ़ाइलें केवल इंस्टॉलेशन के दौरान उपयोग की जाती हैं और इसे इंस्टॉल किए जा रहे एप्लिकेशन के हिस्से के रूप में नहीं माना जाएगा।

अद्यतन: एक CustomAction और एक बाइनरी के बीच संबंध BinaryKey विशेषता का उपयोग कर कस्टम क्रिया से बाइनरी संदर्भित किया जाता है।

जब तक आप कई BinaryKey गुण हो सकता है (मैं इस प्रयास नहीं किया है और सीधे MSI custom action table में इस के लिए कोई समर्थन नहीं देखता) आप केवल पर एक द्विआधारी आधार पर एक कस्टम क्रिया हो सकता है। इस प्रकार बाइनरी को सभी आवश्यक निर्भरताओं को अपने भीतर ही ले जाने की आवश्यकता होगी।

उस ने कहा, यदि आपके डीएलएस सभी हैं। नेट असेंबली, एक विचार उन्हें ILMerge का उपयोग एक ही असेंबली में पैकेज करने के लिए करना होगा।

+1

यह काम नहीं करेगा। अतिरिक्त बाइनरी धाराओं में से कोई भी निकाला नहीं जाता है। –

3

विजुअल स्टूडियो में True के हार्ड संदर्भ पर 'स्थानीय कॉपी करें' संपत्ति सेट करें।

1

मिस्टरिंग की टिप्पणी के बाद, मैं थोड़ा और विस्तार भरूंगा।

मान लें कि आप कम से कम Wix 3.0 पर हैं, तो आप एक एकल DLL में पैकेज निर्भरताओं के लिए MakeSfxCA.exe का उपयोग कर सकते हैं। (यह डीएफटी - परिनियोजन उपकरण फाउंडेशन से एक ऐड-इन था।) असल में, यह सुनिश्चित करके शुरू करें कि प्रोजेक्ट आपके आश्रित डीएलएल की प्रतिलिपि बना रहा है। एक कस्टमएक्शन.कॉन्फिग फ़ाइल बनाएं।

REM MyMakeSfxCA.bat - Run under $(TargetDir); abs. paths reqd. 
"%WIX%\SDK\MakeSfxCA"^
    %cd%\Managed_custom_action_pkg.dll^
    "%WIX%\SDK\x86\sfxca.dll"^
    %cd%\Managed_custom_action.dll^
    %cd%\Dependent1.dll^
    %cd%\Dependent2.dll^
    %cd%\Microsoft.Web.Administration.dll^
    %cd%\Microsoft.Deployment.WindowsInstaller.dll^
    %cd%\CustomAction.config 

एक बार है कि काम करता है, एक के बाद बिल्ड घटना में तब्दील: की तरह एक साधारण .bat फ़ाइल के साथ टेस्ट

:

"$(WIX)\SDK\MakeSfxCA"^
    $(TargetDir)\Managed_custom_action_pkg.dll^
    "$(WIX)\SDK\x86\sfxca.dll"^
    $(TargetDir)\Managed_custom_action.dll^
    $(TargetDir)\Dependent1.dll^
    $(TargetDir)\Dependent2.dll^
    $(TargetDir)\Microsoft.Web.Administration.dll^
    $(TargetDir)\Microsoft.Deployment.WindowsInstaller.dll^
    $(TargetDir)\CustomAction.config 

अपने .wxs फ़ाइल में, अपने द्विआधारी कुंजी की तरह दिखाई देगा

<Binary Id="Managed_custom_action_CA_dll" 
     SourceFile="$(var.Managed_custom_action.TargetDir)$(var.Managed_custom_action.TargetName)_pkg.dll" /> 

उनके लिए CustomAction.config, आप ऑनलाइन उदाहरण पा सकते हैं।

यह मैंने पाया है कि यह सबसे अच्छा तरीका है।

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