2010-06-01 16 views
10

के लिए बिल्ड करते समय x86 बनाम AnyCPU को लक्षित करना मेरे पास एक मौजूदा सी # एप्लिकेशन .NET 2.0 के लिए लिखा गया है और इस समय किसी भीCPU को लक्षित करता है। यह वर्तमान में कुछ तृतीय पक्ष .NET DLL का संदर्भ देता है जिनके पास मेरे पास स्रोत नहीं है (और मुझे यकीन नहीं है कि वे x86, x64 या AnyCPU के लिए बनाए गए थे)।64 बिट विंडो ओएसई

मैं एक 64 बिट विंडोज ओएस, जो मंच मैं अपने अनुप्रयोग के लिए क्रम में लक्षित कर त्रुटियों के बिना चलाने के लिए चाहिए पर विशेष रूप से अपने आवेदन को चलाना चाहते हैं? इस समय मेरी समझ लक्षित करने के लिए है:

  • : कम से कम एक तीसरे पक्ष के नेट dll 86 या उपयोग पी के लिए बनाया गया है, तो/आह्वान Win32 DLLs के साथ इंटरफेस करने। 32 बिट और 64 बिट ओएस दोनों पर 32 बिट मोड में एप्लिकेशन चलाया जाएगा।
  • : सभी तृतीय पक्ष नेट DLLs पहले से ही 64 या AnyCPU के लिए बनाया जाता है। एप्लिकेशन केवल 64 बिट ओएस में चलाएगा।
  • AnyCPU: सभी तृतीय पक्ष नेट DLLs पहले से ही AnyCPU के लिए बनाया जाता है। एप्लिकेशन 32 बिट ओएसईएस पर 64 बिट मोड और 64 बिट ओएस पर 64 बिट में चलाएगा।

इसके अलावा, मैं सही विश्वास है कि, जबकि लक्षित कर AnyCPU कोई त्रुटि है जब एक आवेदन तीसरे पक्ष के 86 नेट DLLs संदर्भित निर्माण उत्पन्न होगा, आवेदन एक क्रम अपवाद फेंक जब यह जब इसे चलाता इन DLLs लोड करने के लिए कोशिश करता है एक 64 बिट ओएस पर।

इसलिए, जब तक कि मेरे तीसरे पक्ष DLLs में से एक पी कर रहा है/आह्वान या 86 कर रहे हैं, मैं केवल इस आवेदन के लिए 86 लक्षित कर सकते हैं?

उत्तर

7

आप किसी भी एसीसीपीयू डीएलएल से पी/आमंत्रण कर सकते हैं, तो आपको केवल पी/आमंत्रण परिभाषाओं के बारे में थोड़ा और सावधान रहना होगा (यानी कि आप अनजाने में 32-बिट या कुछ नहीं मान रहे हैं)। समस्या यह है कि यह जानना मुश्किल है कि क्या कोई तृतीय पक्ष डीएलएल प्रतिबिंबक के बिना सही चीज कर रहा है और इसे अलग कर रहा है (जब तक डेवलपर विशेष रूप से 64-बिट समर्थन का उल्लेख नहीं करता)।

लेकिन उस के अलावा अन्य, आप काफी स्पॉट पर हैं।

अनुप्रयोगों के 99% के लिए ईमानदारी से कहूं तो, लक्ष्यीकरण 86 पूरी तरह से स्वीकार्य है। यह अपेक्षाकृत कम संख्या में अनुप्रयोग है जो वास्तव में 64-बिट होने से लाभान्वित होता है। (प्रदर्शन मुद्दे आम तौर पर धुलाई के रूप में बाहर आते हैं: अधिक रजिस्टरों को x86 मोड और बड़े डेटा संरचनाओं के रजिस्टर नाम से ऑफसेट किया जाता है क्योंकि पॉइंटर्स दो गुना बड़ा होते हैं [और संदर्भ-भारी प्रणाली जैसे .NET की तुलना में भी बदतर]]

7

मैं आपके प्रश्न के इस विशिष्ट भाग के रूप में उत्सुक था।

इसके अलावा, मैं सही विश्वास है कि जबकि लक्ष्यीकरण AnyCPU जब एक आवेदन तीसरे पक्ष के 86 नेट DLLs संदर्भित निर्माण नहीं त्रुटियों उत्पन्न होगा, आवेदन एक क्रम अपवाद फेंक जब यह लोड करने के लिए कोशिश करता है ये DLLs जब यह 64 बिट ओएस पर चलता है।

तो मैंने इसे आजमाया। मैंने एक डीएलएल प्रोजेक्ट ClassLibrary1 बनाया जिसने लक्षित x86 को लक्षित किया, फिर ConsoleApplication1 जोड़ा जो किसी भी सीसीपीयू को लक्षित करता था और अन्य प्रोजेक्ट का संदर्भ देता था। मैंने मुख्य विधि में क्लास लाइब्रेरी 1 प्रोजेक्ट से वास्तव में कक्षा का उपयोग करना सुनिश्चित किया है।

विजुअल स्टूडियो ने मुझे संदर्भ या आवेदन के बारे में कोई चेतावनी या शिकायत नहीं दी। जब मैंने एप्लिकेशन चलाया (64 बिट ओएस पर) और क्लास लाइब्रेरी 1 असेंबली लोड हो गई, तो मुझे BadImageFormatException के साथ बधाई दी गई।

यदि मैंने x64 को लक्षित करने के लिए ConsoleAplication1 को बदल दिया है, तो मुझे कंपाइलर चेतावनियां मिलती हैं लेकिन संकलन सफल होता है और रनटाइम पर एक ही अपवाद होता है।

तो अपने प्रश्न का उत्तर देने के लिए, यदि आप संदर्भित असेंबली (या उस मामले के लिए रनटाइम पर लोड की गई किसी भी असेंबली) को भी किसी भी सीसीपीयू के लिए संकलित नहीं किया जाता है, तो आप परेशानी में बहुत अच्छी तरह से भाग सकते हैं। यदि आप अनिश्चित हैं, और आपको अतिरिक्त पता स्थान की आवश्यकता नहीं है, तो मैं x86 को लक्षित करने के लिए चिपकना चाहता हूं। यदि आप सुनिश्चित हैं कि आपकी निर्भरताएं किसी भी सीसीपीयू के लिए संकलित की गई हैं, तो आप किसी भी सीसीपीयू को लक्षित कर सकते हैं यदि आप चाहें लेकिन दोनों प्रोसेसर आर्किटेक्चर में बहुत से परीक्षण करना सुनिश्चित करें।

+0

कोई भी वीसीयू मेरे वीएस इंस्टेंस के लिए डिफ़ॉल्ट लक्ष्यित प्लेटफार्म है, जो स्पष्ट रूप से ठीक है जब आपके पास .NET ढांचे के अलावा अन्य कोई निर्भरता नहीं है। एक बार अन्य निर्भरताओं को पेश करने के बाद, धारणा है कि ऐप 64 बिट प्लेटफॉर्म पर काम करना जारी रखेगा क्योंकि एप्लिकेशन को किसी भी सीसीपीयू के लिए लक्षित किया गया है और बिना किसी समस्या के संकलन एक दर्दनाक होगा। जवाब के लिए धन्यवाद :) – anonymous