2014-10-27 6 views
5

2 Winform परियोजनाओं एक है कहो, बीसी # दोनों X86 और किसी भी सीपीयू

प्रोजेक्ट ए (.NET 2.0 को लक्षित) का उपयोग कर परियोजनाओं x86 पर चलने के लिए किया गया है (यह एक बाहरी पुस्तकालय है) और विरासत कारणों के लिए प्रोजेक्ट बी (लक्ष्य .NET 4.0) को किसी भी CPU पर चलाना होगा। अब मैं परियोजना बी से एक के तरीकों कॉल करने की आवश्यकता है, लेकिन यह एक त्रुटि फेंकता है:

"An unhandled exception of type 'System.BadImageFormatException' occurred in System.Windows.Forms.dll" 

Additional information: Could not load file or assembly 'CSharpDemo, Version=1.0.5414.18636, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format." 

हालांकि, मैंने पाया है कि अगर मैं .NET 4.5 पर परियोजना बी को लक्षित तो इस समस्या नहीं होती है। लेकिन मैं अभी भी प्रोजेक्ट बी को 4.0 लक्ष्यीकरण करना चाहता हूं, इसे कैसे प्राप्त किया जाए?

+0

कोई भीCPU 32 बिट पसंद करता है? – Steve

+0

ज्यादातर इसे 32 बिट मशीन पर चलाना चाहिए, लेकिन मैं प्रोजेक्ट बी की सेटिंग को x86 में नहीं बदल सकता क्योंकि यह अन्य परियोजनाओं को प्रभावित कर सकता है – wuha

+1

यह तब एक मृत अंत लगता है। 64 बिट ओएस पर AnyCPU का मतलब है 64 बिट कोड और 64 बिट कोड 32 बिट पुस्तकालयों को कॉल नहीं कर सकता है। http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/ – Steve

उत्तर

8

यदि आपका कोई भी कोड 32-बिट x86 पुस्तकालयों को कॉल करता है, तो पूरी प्रक्रिया को x86 के रूप में लोड करने की आवश्यकता होती है। कोई अपवाद नहीं।

ऐसा करने के लिए, EXE प्रोजेक्ट को x86 पर सेट करें, डीएलएल प्रोजेक्ट्स सेट करें जिनके पास मूल x86 निर्भरता x86 है, और शुद्ध प्रबंधित DLL प्रोजेक्ट्स के लिए आप AnyCPU का उपयोग कर सकते हैं - .NET उन्हें आपके x86 EXE के लिए x86 के रूप में लोड करेगा, लेकिन वे x64 EXEs में भी लोड कर सकते हैं।

याद रखें कि x86 कोड x64 विंडोज़ चलाने वाले x64 प्रोसेसर पर ठीक है, WOW64 संगतता परत की सहायता से।

(सीमित अपवादों के साथ: विंडोज सर्वर संस्करण पर, WOW64 एक वैकल्पिक घटक है, और प्रीइंस्टॉल वातावरण में कोई WOW64 नहीं है)।

+0

EXE प्रोजेक्ट द्वारा, क्या आपका मतलब विजुअल स्टूडियो में स्टार्ट अप प्रोजेक्ट है? मेरे पास x86 लाइब्रेरी को छोड़कर एएनसीपीयू का उपयोग कर सबकुछ है, इसलिए इसका मतलब है कि मुझे केवल स्टार्टअप को x86 में बदलना होगा और बाकी को सही छोड़ दें? – wuha

+0

@wuha: स्टार्टअप प्रोजेक्ट एक EXE प्रोजेक्ट होगा, हां। कभी-कभी एक समाधान में कई EXEs होते हैं, लेकिन आपका मुख्य कार्यक्रम निश्चित रूप से एक EXE है। –

+0

अच्छा जवाब @BenVoigt – Steve

4

आप ब्लॉग पोस्ट निम्नलिखित में अपने प्रश्न का उत्तर मिल सकता है

http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/

यहाँ सारांश

.net 4,0

What AnyCPU used to mean up to .NET 4.0 (and Visual Studio 2010) is the following:

•If the process runs on a 32-bit Windows system, it runs as a 32-bit process. IL is compiled to x86 machine code.

•If the process runs on a 64-bit Windows system, it runs as a 64-bit process. IL is compiled to x64 machine code.

•If the process runs on an Itanium Windows system (has anyone got one? ;-)), it runs as a 64-bit process. IL is compiled to Itanium machine code.

.net 4.5

In .NET 4.5 and Visual Studio 11 the cheese has been moved. The default for most .NET projects is again AnyCPU, but there is more than one meaning to AnyCPU now. There is an additional sub-type of AnyCPU, “Any CPU 32-bit preferred”, which is the new default (overall, there are now five options for the /platform C# compiler switch: x86, Itanium, x64, anycpu, and anycpu32bitpreferred). When using that flavor of AnyCPU, the semantics are the following:

•If the process runs on a 32-bit Windows system, it runs as a 32-bit process. IL is compiled to x86 machine code.

•If the process runs on a 64-bit Windows system, it runs as a 32-bit process. IL is compiled to x86 machine code.

•If the process runs on an ARM Windows system, it runs as a 32-bit process. IL is compiled to ARM machine code.

है
+0

फिर इसका मतलब है कि .NET 4.0? – wuha

+0

के तहत "किसी भी CPU" प्रोजेक्ट से x86 प्रोजेक्ट के तरीकों को कॉल करने का कोई तरीका नहीं है। – Mayank

+0

हालांकि आप .NET 4.0 और 4.5 दोनों में एक ही कोड संकलित कर सकते हैं और परियोजनाओं में उचित असेंबली का उपयोग कर सकते हैं। – Mayank

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