2010-01-14 13 views
6

के लिए एक प्रबंधित रैपर बनाना हम एक अप्रबंधित DLL के आसपास एक सी # रैपर बना रहे हैं। अप्रबंधित डीएलएल 32 और 64 बिट दोनों संस्करणों में आता है। हम प्रबंधित रैपर को अपने स्वयं के प्रोजेक्ट में रखते हैं ताकि हम इसे एक अलग घटक के रूप में बना सकें और समाधानों में इसका पुन: उपयोग कर सकें।32 बिट और 64 बिट अप्रबंधित DLL

हालांकि इससे कुछ समस्याएं होती हैं। चूंकि अप्रबंधित डीएलएल के पास 32 बिट और 64 बिट दोनों संस्करणों के लिए समान नाम है, इसलिए हमें आउटपुट (बिन) निर्देशिका में सही अप्रबंधित DLL को स्थानांतरित करने में समस्या हो रही है। यदि बिल्ड कॉन्फ़िगरेशन x86 है तो हम 32 बिट संस्करण और 6464 x64 के साथ प्रतिलिपि बनाना चाहते हैं। केवल एक प्रोसेसर आर्किटेक्चर के साथ यह हासिल करना आसान है। हम सिर्फ हमारे प्रोजेक्ट में अप्रबंधित डीएलएल शामिल करते हैं और फाइल को स्थानीय पर प्रतिलिपि बनाते हैं। लेकिन चूंकि हमें इसे और अधिक मुश्किल बनाने की जरूरत है।

हमें यह लिंक Targeting both 32bit and 64bit with Visual Studio in same solution/project मिला है, लेकिन ऐसा लगता है कि यह कुछ डीएलएल संदर्भित है जो पहले से ही मशीन पर मौजूद है। हम आउटपुट निर्देशिका (बिन) में डीएलएल का सही संस्करण कॉपी करना चाहते हैं।

इसका समाधान करने के तरीके पर कोई सुझाव या तकनीक स्वागत से अधिक है।

उत्तर

1

आप इस मामले में अपने निर्माण को नियंत्रित करने के लिए एमएसबिल्ड जैसे कुछ का उपयोग करना चाहेंगे। फिर आपके पास 32 या 64 बिट संकलन करने के लिए उपयोग किए जाने वाले संकलन ध्वज हो सकते हैं। ऐसा करने से यह आपको नियंत्रित करने की अनुमति देगा कि आप किस धक्का को दबाएंगे। यह आपके सबसे अच्छे विकल्प की तरह लगता है। यदि आपको एमएसबिल्ड पसंद नहीं है तो आप नेंट का भी उपयोग कर सकते हैं।

1

एक अन्य विकल्प विजुअल स्टूडियो में डीबग और रिलीज के अलावा एक नया कॉन्फ़िगरेशन बनाना होगा .... शायद डीबग 32 और डीबग 64, आदि कॉन्फ़िगरेशन सेटिंग्स में से एक सीपीयू आर्किटेक्चर है।

फिर अपने प्रोजेक्ट के पद निर्माण की घटनाओं में, आप एक पुराने जमाने अगर/किसी और बयान शर्त के रूप में मंच नाम मैक्रो का उपयोग

कर सकते हैं ... या यदि आप अपने समाधान में उपनिर्देशिका के रूप में मंच का नाम इस्तेमाल किया जहां अप्रबंधित डीएल संग्रहीत किया गया था, आप प्लेटफ़ॉर्म नाम का उपयोग करके निर्देशिका से प्रतिलिपि बना सकते हैं।

0

यदि आप अपनी कॉन्फ़िगरेशन को दो प्लेटफ़ॉर्म रखने के लिए सेट करते हैं, तो 32 बिट और 64 बिट संस्करणों में से एक। फिर आप प्रत्येक प्लेटफ़ॉर्म के लिए सही डीएलएल संस्करण में संदर्भ सेट करते हैं, तो आपको केवल अपने संदर्भ गुणों पर प्रतिलिपि स्थानीय ध्वज सेट करना होगा और vsts इसे आपके लिए सभी को संभालेगा। कोई उपद्रव कोई अव्यवस्था नहीं।

5

मैं फ्री इमेज लाइब्रेरी के लिए नेट रैपर के साथ इस मुद्दे को अभी चला गया। मैंने जो किया वह दो बिल्ड कॉन्फ़िगरेशन, x86 के लिए एक और प्रोजेक्ट के लिए x64 के लिए एक था जो प्रबंधित रैपर का संदर्भ देता है। मैं तो जैसे प्रोजेक्ट फाइल के AfterBuild लक्ष्य में MSBuild सशर्त प्रतिलिपि वर्गों कहा:

<Target Name="AfterBuild"> 
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" /> 
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" /> 
    </Target> 
+0

हाय और उत्तर के लिए धन्यवाद। जैसा कि आपने रैपर प्रोजेक्ट की प्रोजेक्ट फ़ाइल में सुझाया है, हमने बाद के लक्ष्य को कार्यान्वित किया है। हालांकि, रैपर परियोजना का संदर्भ देने वाली अन्य परियोजनाओं से अप्रबंधित डीएलएल को रैपर डीएलएल के साथ बिन निर्देशिका में कॉपी नहीं किया गया है। इसे कैसे प्राप्त करें इस पर कोई सुझाव? – flalar

+0

आम तौर पर, हम सभी परोक्ष रूप से संदर्भित और/या गतिशील रूप से लोड असेंबली के लिए क्या करते हैं, उन्हें पोस्ट बिल्ड कमांड के साथ एक सामान्य आउटपुट फ़ोल्डर में अपनी परियोजनाओं से लक्षित करें। फिर उन्हें जिन परियोजनाओं की आवश्यकता होती है उन्हें उन्हें प्री-पोस्ट बिल्ड कमांड के साथ अपने टार्गेटडियर में कॉपी भी किया जाता है। उदाहरण धक्का: xcopy "$ (TARGETDIR) $ (TargetFileName)" "$ (SolutionDir) PluginOutput \"/ई/वाई उदाहरण पुल: xcopy "। $ (SolutionDir) PluginOutput \ * dll" "$ (TARGETDIR) "/ ई/वाई – duckworth

+0

आपको फ्रीइमेज डीएलएल का x64 संस्करण कहां मिला? मैं इसे कुछ समय के लिए देख रहा हूं, लेकिन कोई भी अस्तित्व में नहीं है! –

1

हम इस के साथ हमारे परियोजनाओं के साथ हर समय सौदा।

हमारे पास एक अप्रबंधित सी ++ डीएलएल है जिसमें 32- और 64-बिट संस्करण हैं, और एक सी # प्रोजेक्ट जो अप्रबंधित DLL में कॉल करने के लिए पी/Invoke का उपयोग करता है।

सी ++ DLL के लिए, यह लक्ष्य पथ है:

$ (PLATFORMNAME) \ $ (ConfigurationName) \ $ टार्गेटनाम)

तो 32-बिट रिलीज निर्माण Win32 \ रिलीज में जाती थी, और 64-बिट डीबग बिल्ड x64 \ डीबग में जाएगा।

सी # प्रोजेक्ट में हम 'कोई भी CPU' कॉन्फ़िगरेशन हटाते हैं, और इसे एक नए 'x86' कॉन्फ़िगरेशन और 'x64' कॉन्फ़िगरेशन के साथ प्रतिस्थापित करते हैं। इसकी आउटपुट निर्देशिका अप्रबंधित सी ++ डीएलएल के समान होती है, सिवाय इसके कि .NET कंपाइलर 'x86' का उपयोग करता है जबकि सी ++ 32-बिट आर्किटेक्चर निष्पादन योग्य को इंगित करने के लिए 'Win32' का उपयोग करता है।

सी # प्रोजेक्ट के लिए पोस्ट-बिल्ड चरण में हम उपयुक्त अप्रबंधित DLL को C# निष्पादन योग्य के लिए लक्षित निर्देशिका में कॉपी करते हैं। चूंकि प्रत्येक आर्किटेक्चर और सी # प्रोजेक्ट की प्रत्येक कॉन्फ़िगरेशन में एक अलग आउटपुट निर्देशिका है, इसलिए अप्रबंधित DLL का कौन सा आर्किटेक्चर सीधे आउटपुट निर्देशिका में रखता है; वे हमेशा मेल खाते हैं।

इसे और सरल बनाने के लिए मेरा सुझाव है कि आप एक बहु-फ़ाइल असेंबली (http://msdn.microsoft.com/en-us/library/226t7yxe.aspx) बनाने की जांच करें ताकि आपका अप्रबंधित डीएलएल और उसका सी # रैपर दोनों एक ही .NET असेंबली में रह सकें, जिससे आप इसे कॉपी करने की परेशानी बचा सकते हैं।

+0

तो एक बहु-फ़ाइल असेंबली बहुत सी # असेंबली होगी जिसमें x86 और x64 दोनों अप्रबंधित डीएल शामिल हैं और उचित लोड करता है? – flalar

+0

बिल्कुल नहीं। कहें कि आपके पास ManagedAssembly.dll है, सी # में लिखा गया है, और C++ में NativeAssembly.dll के 32- और 64-बिट संस्करण दोनों हैं। आप दो बहु-फ़ाइल असेंबली बना सकते हैं, एक ManagedAssembly.dll और 32-बिट NativeAssembly.dll के साथ, और दूसरा ManagedAssembly.dll और 64-बिट NativeAssembly.dll के साथ। इस तरह आपको आर्किटेक्चर-अज्ञेय और वास्तुकला-विशिष्ट डीएलएल के मिश्रण के बजाय केवल एक डीएलएल निर्भरता के बारे में चिंता करने की ज़रूरत है। – anelson

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