2012-07-10 7 views
12

.NET कॉम्पैक्ट फ्रेमवर्क के लिए पुन: लक्ष्यणीय असेंबली संदर्भ पेश किए गए हैं और अब पोर्टेबल क्लास लाइब्रेरीज़ का समर्थन करने के लिए उपयोग किए जाते हैं।सी # कंपाइलर पुन: लक्ष्यणीय असेंबली संदर्भों को उत्सर्जित करने का निर्णय कैसे करता है?

मूल रूप से, संकलक का उत्सर्जन करता है निम्नलिखित MSIL:

.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       
    .ver 2:0:5:0 
} 

कैसे सी # संकलक समझते हैं कि यह एक retargetable संदर्भ फेंकना है, और कैसे भी एक पोर्टेबल के बाहर इस तरह के संदर्भ फेंकना सी # संकलक मजबूर करने के लिए करता है कक्षा पुस्तकालय?

+0

MSBuild लक्ष्य फ़ाइलों से कोई संकेत नहीं? मुझे आश्चर्य है कि आपको कमांड लाइन से कंपाइलर को पास करने की क्या ज़रूरत है। – leppie

उत्तर

2

असेंबली के लिए, यह एक असेंबली ध्वज है, यानी [असेंबली: असेंबलीफ्लैग्स (असेंबलीनाम फ्लेग्स। पुनः लक्ष्य योग्य)]।

ध्यान दें कि यह ध्वज प्लेटफार्म असेंबली के बाहर व्यर्थ है - कस्टम असेंबली को पुनः लक्षित करने योग्य नहीं किया जा सकता है।

संदर्भों के लिए, इसे संदर्भित असेंबली से नाम के हिस्से के रूप में कॉपी किया गया है।

+0

धन्यवाद। यह वही है जिसे मैं देख रहा था। मैं संदेश से छुटकारा पाने की उम्मीद कर रहा था 'फ़ाइल या असेंबली लोड नहीं कर सका' पोस्टशर्प, संस्करण = 3.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = 53 डी 2effcf2ee70dc, पुनः लक्ष्य योग्य = हां 'या इसकी निर्भरताओं में से एक। स्थित असेंबली की स्पष्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है।(HRESULT से अपवाद: 0x80131040) 'जब (IHostAssemblyStore के माध्यम से) सीएलआर अनुरोध के मुकाबले एक और असेंबली प्रदान करते हैं, लेकिन मुझे अभी भी एक पुनः लक्ष्यणीय संदर्भ के साथ भी त्रुटि मिलती है। क्या इसका कोई कामकाज है? –

+0

रिटार्जेबल आपको उपयोगकर्ता असेंबली को कूदने की अनुमति नहीं देगा, जैसा कि मुझे लगता है कि आप कोशिश कर रहे हैं। यह पूरी तरह से सीएलआर आंतरिक उद्देश्यों के लिए है। मैं होस्टिंग एपीआई पर एक विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि लोडफाइल आपको ऐसा करने की अनुमति दे सकता है। –

+0

धन्यवाद। मैं एक और समाधान का प्रयास करूंगा: एक ही छोटा नाम, एक ही मजबूत नाम कुंजी, लेकिन अलग संस्करण संख्या। सामान्य बाध्यकारी नीतियों को चाल करना चाहिए। –

2

यह सुनिश्चित नहीं है कि इससे मदद मिलेगी, लेकिन निम्न फ़ाइल स्वत: जेनरेट की गई थी और निर्माण में शामिल थी।

using System; 
using System.Reflection; 
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(
    ".NETPortable,Version=v4.0,Profile=Profile4", 
    FrameworkDisplayName = ".NET Portable Subset")] 

यह कुछ जादू करने के लिए संकलक को संकेत दे सकता है।

संपादित करें:

मैं ऊपर लगता है कि एक पुस्तकालय पोर्टेबल बनाता है। कमांड लाइन से मैं देख सकता हूं कि /nostdlib+ का उपयोग किया जाता है, और एक पोर्टेबल mscorlib.dll संदर्भित किया गया है (जो मुझे लगता है कि ऊपर वर्णित वही विशेषता है)।

"... \ Program Files \ संदर्भ विधानसभाओं \ Microsoft \ Framework.NETPortable \ v4.0 \ प्रोफाइल \ Profile4 \ mscorlib.dll"

+1

क्लाइंट और पूर्ण फ्रेमवर्क के लिए 'targetFrameworkAttribute' भी मौजूद है v4 के लिए बनाता है, यह v3.5 के आसपास नहीं है। यही कारण है कि उन्होंने विशेषता को जोड़ा। V4 के रूप में, यह निर्धारित करने का एक बहुत ही आसान तरीका भी प्रदान करता है कि पूर्ण ढांचे या ग्राहक प्रोफ़ाइल के लिए कोई असेंबली बनाया गया था या नहीं। –

+0

@AdamHouldsworth: धन्यवाद, और मुझे लगता है कि अब अप्रचलित है अब क्लाइंट प्रोफाइल 4.5 में चला गया है? ; पी – leppie

+0

यहां तक ​​कि .NET 4 में भी क्लाइंट प्रोफाइल और पूर्ण डाउनलोड के बीच का अंतर कुछ एमबी लॉल था, इसके लायक नहीं - संभवतः उन्होंने इसे पीसीएल के पक्ष में क्यों डिब्बाबंद किया। –

0

मैं प्रयोग है कि सी # संकलक एक होगा द्वारा ध्यान दिया है संदर्भ संकलक को पुन: लक्ष्यणीय के रूप में संदर्भित किया गया है यदि संदर्भित असेंबली को पुनः लक्ष्यीकरण के रूप में चिह्नित किया गया है (MSIL में .assembly अनुभाग पर एक संशोधक)। मुझे नहीं मिला कि संकलक असेंबली को फिर से लक्षित करने का फैसला करता है, फिर भी।

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

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