मेरे पिछले प्रश्न के रूप में ("- पैकिंग संरचनाओं, कॉल और कॉलबैकसी # AnyCPU लाइब्रेरी का उपयोग कर 86/64 सी API") है कोई सफलता मिली , मैं एक और संक्षिप्त और सार लिखूंगा।सी ++ 86/64 संरचना संरेखण + नेट AnyCPU सी ++ पुस्तकालय के उपयोग (कॉल/कॉलबैक)
चित्र:
कंपनी जहाँ मैं काम के लिए एक सॉफ्टवेयर 64 बिट पर भेजा जाना है। सॉफ्टवेयर में सीएआई लाइब्रेरी (सी ++ के साथ सी ++) सी एपीआई पर दो रैपर होते हैं: एक सी ++ रैपर और एक .NET wrapper।
सी ++ BASE लाइब्रेरी & सी ++ WRAPPER में x86/x64 बिल्ड कॉन्फ़िगरेशन होना चाहिए। .NET WRAPPER में केवल एक AnyCPU बिल्ड कॉन्फ़िगरेशन होना चाहिए।
.NET WRAPPER से सही लाइब्रेरी चुनना सफलतापूर्वक पूरा हो गया है (सी ++ बेस पुस्तकालय (x86/x64) दोनों को दो अलग-अलग नामस्थानों में लोड किया जा रहा है और IntPtr के आकार के आधार पर सही कार्यों को रनटाइम पर बुलाया जाता है; यह दोनों पुस्तकालयों के लिए जरूरी नहीं है, लेकिन केवल एक ही इस्तेमाल किया जाना चाहिए)।
समस्या:
सभी आधार पुस्तकालय में संरचनाओं 4 बाइट पर गठबंधन कर रहे हैं:
#pragma pack(push,4)
आदेश कोड पाने के लिए 64-बिट पर कोई चेतावनी के साथ संकलन, मेरे पास है
#ifdef WIN64
#pragma pack(push,8)
#else
#pragma pack(push,4)
#endif
समस्या है: चयनात्मक संरेखण (सी ++ आधार & सी ++ आकर्षण की तरह आवरण काम) जोड़ा .NET में संरचनाओं से संबंधित:
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
internal struct DBConnectionSettings{...}
यह संरचना चयनात्मक पैकिंग नहीं हो सकता है के बाद से AnyCPU केवल वांछित आवरण विन्यास है।
यह एक अलग .NET नामस्थान में 8 बाइट्स पर गठबंधन अलग संरचनाओं को बनाने के लिए बहुत कठिन है (पीड़ितों की कमी और बहुत कम है ... फिर भी, यह एकमात्र समाधान हो सकता है जिसे हम पूरी तरह से काम कर सकते हैं।
चेतावनी के दोनों x86 और x64 मुद्दों बहुत के लिए 4-बाइट संरेखण के लिए वापस गिरने के रूप में संरचनाओं की 100% विशेष रूप से एकल ऑपरेटरों के लिए, पैकिंग के प्रति संवेदनशील हैं (समस्याओं केवल 4 बाइट्स पर संरेखण के साथ 64 समाधान विन्यास पर प्रकट)। क्रैश के बहुत सारे, संरचनाओं को गठबंधन नहीं किया जा सकता है जब तक हम डमी सदस्यों को नहीं जोड़ते। मुझे जिक्र करना चाहिए कि संरचना को अर्थ/लाइसेंस/लक्ष्य ओएस (ifdefs) से संबंधित समूह के आधार पर समूहीकृत किया गया है। सभी संभावनाओं के लिए पैडिंग (डमी) सदस्यों को जोड़ना महीनों की मांग करेगा।
8 बाइट्स पर सबकुछ संरेखित करना समाधान नहीं है और न ही हम फिर से जगह पर दुर्घटनाग्रस्त हो जाते हैं - केवल x86 के लिए, x64 अच्छा काम करता है - संरचना संरेखण को फिर से डमी (पैडिंग) सदस्यों और आकार के आधार पर समूहबद्ध करने की आवश्यकता होती है।
निष्कर्ष (सवाल):
1) यह दोनों x86 और x64 समाधान विन्यास के लिए 4 के संरेखण के लिए एक सी ++ कोड के लिए संभव है? इसे किस तरह पूर्ण कर सकते है?
2) x86 और x64 संरेखण के लिए सबसे अच्छा विकल्प क्या है? सूचक आकार निश्चित रूप से संरेखण (मेरी राय में) पर शासन करना चाहिए। हम तेजी से सॉफ्टवेयर चाहते हैं, जरूरी नहीं कि मेमोरी-कुशल (अब तक स्मृति फिंगरप्रिंट x86 सिस्टम पर 15 एमबी और 2 जीबी के बीच कहीं है)।
3) .NET और C के बीच इंटरऑप के संबंध में फ़ंक्शन पॉइंटर्स वाले संरचनाओं की विशेष आवश्यकताएं क्या हैं?
4) किसी सुझाए गए विकल्प की अत्यधिक सराहना की जाती है।
हम इस इंटरनेट पर एक से अधिक महीने (हमारे ग्रह पर एक) खोज रहे हैं लेकिन हम कहीं भी नहीं आए हैं। कुछ आर्किटेक्ट्स चुनिंदा पैकिंग (4/8) का उपयोग करने की मांग करते हैं जबकि कुछ तर्क देते हैं कि सॉफ्टवेयर सीधे आगे नहीं है और इसे दोबारा किया जाना चाहिए। यह मेरा निर्णय नहीं है कि क्या करना है, लेकिन मैं अच्छे तर्कों के साथ विचार ला सकता हूं। यह सॉफ़्टवेयर 2000 के उत्तरार्ध में शुरू हुआ था, जब एसटीएल छोटी थी, इसलिए बीएएसई के पास अपने स्वयं के कंटेनर हैं जो भगवान के लिए अनुकूलित हैं-क्या-क्या। मुझे अपनी राय यहां व्यक्त नहीं करनी चाहिए क्योंकि यह ईसाई नहीं है।
हाय एमएसल्टर्स, किसी भी इनपुट के बिना यह तय किया गया है कि पुनर्गठन किया जाएगा, जो भी लाइसेंसिंग निर्भर है और सिस्टम निर्भर संरचनाओं के खिलाफ हो सकता है। फिर भी, मैं इस विषय को पोस्ट किए जा सकने वाले किसी भी अन्य समाधान के लिए खोला जाएगा। यह सिर्फ इतना है कि मैं उत्सुक हूं कि इस तरह के कोड के साथ क्या किया जा सकता है ..... पीएस: यह मेरा कोड नहीं है;) – ro0ter