2011-12-06 16 views
5

PresentationCore.dll और WindowsBase.dll में PresentationCore और WindowsBase DLLs का उपयोग करते हुए दोनों माइक्रोसॉफ्ट .NET फ्रेमवर्क 3.0 के साथ शामिल किए गए हैं, और प्रत्येक dll के दो संस्करणों डिस्क पर स्थापित कर रहे हैं:दोनों x64 और x86 वातावरण

  • एक सी के तहत x64 संस्करण: \ Program Files \ संदर्भ विधानसभाओं \ Microsoft \ फ्रेमवर्क \ v3.0
  • सी के तहत एक x86 संस्करण: \ Program Files (x86) \ संदर्भ विधानसभाओं \ Microsoft \ फ्रेमवर्क \ v3.0

इन डीएलएस के संदर्भ जोड़ने तक, हमारे एएसपी.नेट वेब ऐप में सक्षम था "किसी भी CPU" के लिए संकलित किया जाए और बिना किसी समस्या के 32 बिट या 64 बिट मोड में चलाया जाएगा।

Could not load file or assembly 'PresentationCore' or one of its dependencies. An attempt was made to load a program with an incorrect format.

जाहिर है: मानक के माध्यम से करने के लिए, कहते हैं, PresentationCore एक संदर्भ जोड़ने के बाद "जोड़ें संदर्भ" संवाद (- -> नेट संदर्भ जोड़ें> PresentationCore), वेब अनुप्रयोग जब निम्न त्रुटि के साथ 64 बिट मोड में विफल रहता है ऐसा इसलिए है क्योंकि प्रेजेंटेशनकोर डीएल के 32 बिट संस्करण को लोड करने के लिए 64 बिट ऐप पूल कोशिश कर रहा है और असफल रहा है।

अब, मैं एक छोटे से इस से उलझन में हूँ ...

  1. अन्य .नेट फ्रेमवर्क DLLs (Microsoft.NET/Framework64 या से लोड हो रहा है मूल उनके 64 और x86 संस्करण के बीच स्विच करने लगते हैं Microsoft.NET क्रमशः/फ्रेमवर्क)। प्रेजेंटेशनकोर और विंडोजबेस क्यों अलग हैं?
  2. विजुअल स्टूडियो केवल "संदर्भ जोड़ें" संवाद में ".NET" टैब के अंतर्गत मुझे 32-बिट संस्करण क्यों पेश करता है? अगर मैं 64 बिट संस्करण चाहता हूं, तो मुझे इसके लिए "ब्राउज" करना होगा।
  3. क्या अन्य डीईटी फ्रेमवर्क पुस्तकालयों के लिए ऐसा लगता है कि सही डीएलएल का चयन करने का कोई आसान तरीका है?

हम हमेशा कि स्वचालित रूप से निर्माण समय लक्ष्य पर्यावरण के bitness के आधार पर संदर्भ स्वैप जाएगा MSBuild एक्सएमएल का एक सा लिख ​​सकते हैं, लेकिन यह है कि हम कुछ .नेट फ्रेमवर्क DLLs के लिए क्या करने के लिए नहीं होना चाहिए की तरह लगता है। क्या देता है?

धन्यवाद!

+0

क्या आप वाकई ब्राउज़ का उपयोग करके संदर्भ नहीं जोड़ते हैं? क्या आपने इसे हटाने की कोशिश की है और फिर फिर से जोड़ दिया है? – svick

+0

हाँ, बिल्कुल यकीन है। और हां, हमने इसे हटाने और इसे कई बार फिर से जोड़ने का प्रयास किया है। –

+1

मैंने ऐप पूल उन्नत सेटिंग्स में "32-बिट एप्लिकेशन सक्षम करें" सक्षम करके इस समस्या को ठीक किया है। – Nippysaurus

उत्तर

3

सशर्त रूप से प्रत्येक .dll फ़ाइल को संदर्भित करना संभव है जो आपके सक्रिय निर्माण कॉन्फ़िगरेशन से मेल खाता है। आपको अपनी प्रोजेक्ट फ़ाइल को मैन्युअल रूप से संपादित करने की आवश्यकता होगी। 32-बिट डीएलएल का संदर्भ जोड़ें। फिर प्रोजेक्ट को सेव करें और टेक्स्ट एडिटर में .csproj फ़ाइल को संपादित करें।

संदर्भ तत्व पर एक विशेषता के रूप में आपने जो संदर्भ जोड़ा है उसे जोड़ें और "= $ (प्लेटफ़ॉर्म) == 'x86'" जोड़ें। फिर संदर्भ तत्व की एक और प्रति बनाएं और इसे x64 संस्करण के लिए ट्विक करें। यहाँ ओरेकल ODP.NET चालकों के साथ एक उदाहरण है:

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64" Condition="$(Platform) == 'x64'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x64\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 
<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" Condition="$(Platform) == 'x86'"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>lib\x86\Oracle.DataAccess.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

एक नोट करना महत्वपूर्ण है बात यह है कि तुम अब 'AnyCPU' विन्यास का उपयोग करने में सक्षम हो जाएगा है। आपको x86 या x64 के लिए स्पष्ट बिल्ड कॉन्फ़िगरेशन की आवश्यकता होगी। जिस डीएलएल का आप उपयोग करने का प्रयास कर रहे हैं वह संभवतः ओएस पुस्तकालयों में देशी कॉल कर रहा है, इसलिए आपकी परियोजना अब प्लेटफार्म अज्ञेयवादी नहीं हो सकती है।

यदि आप केवल 1 बिल्ड कॉन्फ़िगरेशन बनाए रखना चाहते हैं, तो आप x86 के साथ जा सकते हैं और केवल x86/32-bit संस्करण का उपयोग कर सकते हैं। यदि यह एक वेब एप्लिकेशन है, तो आपको ऐप पूल को 32-बिट मोड में रखना होगा।किसी भी सीपीयू, 86, 64, या इटैनियम:

अपने मूल qeustions

  • जवाब देने के लिए संपादित आप मंच विकल्प है जब आप एक dll/निष्पादन निर्माण के एक मुट्ठी भर है। कोड जो प्रबंधित कोड में 100% लिखा गया है और मूल पुस्तकालयों पर कोई निर्भरता नहीं है, आमतौर पर संकलित & को किसी भीCPU के रूप में वितरित किया जाता है। ऐसा इसलिए है क्योंकि संकलक द्वारा उत्पन्न परिणामी इंटरमीडिएट भाषा (आईएल) कोड x86, x64, और .NET Framework के Itanium संस्करणों पर चला सकता है। किसी भी सीपीयू को लक्षित करने वाले पुस्तकालयों को प्लेटफ़ॉर्म विशिष्ट (x86, x64, IA64) वाले अनुप्रयोगों से सुरक्षित रूप से संदर्भित किया जा सकता है। प्रेजेंटेशनकोर और विंडोजबेस अलग-अलग कारण हैं क्योंकि उनके पास मूल कोड पर निर्भरता है। आईएल-कोड के विपरीत, जिसे रनटाइम पर व्याख्या किया गया है, मूल कोड में किसी भी CPU की कोई अवधारणा नहीं है। देशी कोड निर्भरताओं के कारण, प्रेजेंटेशनकोर और विंडोजबेस .NET पुस्तकालयों को x86 और x64 के रूप में वितरित करने की आवश्यकता है, क्योंकि AnyCPU संभव नहीं है।
  • जोड़ें संदर्भ संवाद केवल आपको उन पुस्तकालयों को दिखाएगा जो आपके द्वारा लक्षित प्लेटफ़ॉर्म के अनुकूल हैं। यदि आपका लक्ष्य प्लेटफ़ॉर्म x86 है, तो यह आपको केवल कोई भी CPU और x86 लाइब्रेरी दिखाएगा।
  • दुर्भाग्य से, नहीं। यदि आप किसी भी CPU का उपयोग नहीं कर सकते हैं, लेकिन फिर भी x86 और x64 का समर्थन करने की आवश्यकता है, तो आपको एकाधिक बिल्ड कॉन्फ़िगरेशन (x86 के लिए एक और x64 के लिए एक) सेट करने की आवश्यकता है और आपको 32-बिट और 64-बिट डीएल की सशर्त रूप से संदर्भित करने की आवश्यकता है। ऐसा करने का एकमात्र तरीका यह है कि उपर्युक्त विवरण के रूप में प्रोजेक्ट फ़ाइल को संपादित करना है। आपको दोनों कॉन्फ़िगरेशन बनाने और अपने कोड के अलग-अलग 32-बिट और 64-बिट संस्करणों को वितरित करने की आवश्यकता होगी। अगर कोई आपके कोड पर निर्भर करता है, तो उन्हें उसी हुप्स से कूदने की आवश्यकता होगी।
+0

उत्तर के लिए धन्यवाद। हमने आपके प्रोजेक्ट में पहले से ही एक फिक्स लगाया है जैसा कि आप यहां वर्णन करते हैं, लेकिन मुझे इसमें अधिक दिलचस्पी है * क्यों * हमें यह करना है। क्या आप मेरे द्वारा उठाए गए किसी भी प्रश्न का उत्तर दे सकते हैं? –

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