हां, आप x86 और x64 दोनों को एक ही प्रोजेक्ट में समान कोड बेस के साथ लक्षित कर सकते हैं। सामान्य तौर पर, यदि आप वीएस.नेट में सही समाधान कॉन्फ़िगरेशन बनाते हैं, तो चीजें बस काम करेंगी (हालांकि पी / पूरी तरह से अप्रबंधित DLL के लिए आह्वान करना सबसे अधिक संभावना है कि कुछ सशर्त कोड की आवश्यकता होगी): जिन वस्तुओं पर मुझे विशेष ध्यान देने की आवश्यकता है, वे हैं:
- एक ही नाम के साथ प्रबंधित असेंबली के बाहर संदर्भ लेकिन उनकी अपनी विशिष्ट बिटनेस (यह COM इंटरॉप असेंबली पर भी लागू होती है)
- MSI पैकेज (जो, जैसा कि पहले ही नोट किया गया है, x86 या x64 को लक्षित करने की आवश्यकता होगी)
- आपके MSI पैकेज में कोई भी कस्टम .NET इंस्टालर वर्ग-आधारित क्रियाएँ
असेंबली रेफरेंस इश्यू को पूरी तरह से वीएस.नेट के भीतर हल नहीं किया जा सकता है, क्योंकि यह आपको एक बार दिए गए नाम के साथ एक प्रोजेक्ट में एक संदर्भ जोड़ने की अनुमति देगा। इसके चारों ओर काम करने के लिए, अपनी प्रोजेक्ट फ़ाइल को मैन्युअल रूप से संपादित करें (वीएस में, समाधान एक्सप्लोरर में अपनी प्रोजेक्ट फ़ाइल को राइट-क्लिक करें, अनलोड प्रोजेक्ट चुनें, फिर राइट-क्लिक करें और फिर संपादित करें चुनें)। एक संदर्भ, एक विधानसभा के x86 संस्करण, को जोड़ने के बाद, आपकी परियोजना फ़ाइल में कुछ इस तरह होगा:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
उस संदर्भ टैग को लपेटें जो किसी आइटम समूह के अंदर टैग समाधान पर लागू होने वाले समाधान कॉन्फ़िगरेशन को दर्शाता है, जैसे:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
फिर, पूरे आइटम समूह टैग को कॉपी और पेस्ट करें, और अपने 64-बिट DLL के विवरण को समाहित करने के लिए इसे संपादित करें, जैसे:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
वीएस.नेट में अपनी परियोजना को पुनः लोड करने के बाद, विधानसभा संदर्भ संवाद इन परिवर्तनों से थोड़ा भ्रमित हो जाएगा, और आप गलत लक्ष्य प्रोसेसर के साथ असेंबली के बारे में कुछ चेतावनियों का सामना कर सकते हैं, लेकिन आपके सभी बिल्ड बस ठीक काम करेंगे।
MSI समस्या को हल करना अगला है, और दुर्भाग्य से इसके लिए एक गैर-V.NET टूल की आवश्यकता होगी : मैं उस उद्देश्य के लिए Caphyon के एडवांस इंस्टॉलर को प्राथमिकता देता हूं , क्योंकि इसमें शामिल बुनियादी ट्रिक को खींचता है (एक सामान्य MSI बनाएं, साथ ही 32-बिट) और 64-बिट विशिष्ट MSI, और सही संस्करण को निकालने के लिए .EXE सेटअप लॉन्चर का उपयोग करें और रनटाइम में आवश्यक फ़िक्सअप करें) बहुत, बहुत अच्छी तरह से।
आप शायद अन्य टूल या Windows इंस्टालर XML (WiX) टूलसेट का उपयोग करके समान परिणाम प्राप्त कर सकते हैं , लेकिन उन्नत इंस्टॉलर चीजों को इतना आसान बनाता है (और उस पर काफी सस्ती है) कि मैंने वास्तव में कभी विकल्प नहीं देखा है।
उन्नत इंस्टालर का उपयोग करते समय, एक बात के लिए आपको अभी भी वाईएक्स की आवश्यकता हो सकती है, आपके .NET इंस्टालर वर्ग कस्टम क्रियाओं के लिए। यद्यपि यह कुछ क्रियाओं को निर्दिष्ट करने के लिए तुच्छ है, जो केवल कुछ प्लेटफार्मों पर ही चलना चाहिए (क्रमशः संस्करण संस्करण संस्करण का उपयोग नहीं किया जा सकता है), 64-बिट मशीनों पर भी 32-बिट फ्रेमवर्क का उपयोग करके अंतर्निहित AI कस्टम क्रियाओं को निष्पादित किया जाएगा। ।
यह भविष्य के रिलीज़ में ठीक किया जा सकता है, लेकिन अभी के लिए (या अपने MSI बनाने के लिए एक अलग टूल का उपयोग करते समय जो एक ही मुद्दा है), आप उचित बिटनेस के साथ कार्रवाई DLL बनाने के लिए WiX 3.0 के प्रबंधित कस्टम एक्शन सपोर्ट का उपयोग कर सकते हैं जो इसी फ्रेमवर्क का उपयोग करके निष्पादित किया जाएगा।
संपादित करें: संस्करण 8.1.2 के रूप में, उन्नत इंस्टॉलर 64-बिट कस्टम क्रियाओं का सही ढंग से समर्थन करता है। मेरे मूल उत्तर के बाद से, इसकी कीमत में काफी वृद्धि हुई है, दुर्भाग्य से, भले ही यह अभी भी बहुत अच्छा मूल्य है जब InstallShield और इसकी ilk की तुलना में ...
संपादित करें: यदि आपका DLL GAC में पंजीकृत है, तो आप इस तरह से मानक संदर्भ टैग का उपयोग कर सकते हैं (उदाहरण के रूप में SQLite):
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
सभी बिल्ड प्रकार, रिलीज़ या डीबग के लिए भी स्थिति कम हो जाती है, और बस प्रोसेसर आर्किटेक्चर को निर्दिष्ट करता है।