2009-04-06 11 views
12

मैं एक प्रोजेक्ट (शुद्ध शौक, "मेरे कौशल को तेज करना") पर काम कर रहा हूं जिसमें एक एकीकृत बैक एंड और एकाधिक फ्रंट-एंड (एएसपी.नेट एमवीसी 1.0/JQuery और सिल्वरलाइट 2) है। जब मैं सिल्वरलाइट 2 प्रोजेक्ट (VS2008) में अपनी व्यावसायिक परत असेंबली के संदर्भ को जोड़ने का प्रयास करता हूं; यह खारिज हो जाता है, क्योंकि यह सिल्वरलाइट असेंबली नहीं है।मैं सिल्वरलाइट ऐप में गैर-सिल्वरलाइट असेंबली का उपयोग कैसे कर सकता हूं?

क्या सिल्वरलाइट ऐप में गैर-सिल्वरलाइट असेंबली को शामिल करने और संदर्भित करने का उनका तरीका है?

उत्तर

12

कोई नहीं है। सिल्वरलाइट एक पूरी तरह से अलग सीएलआर पर चलता है जो सामान्य (डेस्कटॉप) सीएलआर के साथ असंगत है। इसमें बीसीएल में एपीआई का एक अंतर्निहित अलग सेट है और सबसे महत्वपूर्ण रूप से एक अलग मेटाडेटा संस्करण संख्या है। इन दो कारकों, दूसरों के बीच, सिल्वरलाइट सीएलआर पर डिफ़ॉल्ट रूप से चलने से डेस्कटॉप सीएलआर के लिए संकलित असेंबली को रोकें।

सभी असेंबली विशेष रूप से चांदी की रोशनी के लिए संकलित की जानी चाहिए।

+0

तो मैं सिल्वरलाइट ऐप और बैक एंड के बीच संवाद करने के लिए अपने व्यापार परत में वेब सेवा मुखौटा जोड़ने का बेहतर उपयोग कर रहा हूं? – norbertB

+0

@norbertB हाँ, यह एक अच्छा दृष्टिकोण की तरह लगता है। – JaredPar

+0

यह पूरी तरह से सच है, हालांकि यदि आप मेरी पोस्ट में दूसरा लिंक देखते हैं, तो कोई संकलित .NET (डेस्कटॉप) असेंबली को सिल्वरलाइट में आसानी से परिवर्तित करने का एक चालाक तरीका है। आपको सावधान रहना चाहिए कि आप असेंबली में किस कोड का उपयोग करते हैं (और शायद सशर्त बयान का उपयोग करें)। – Noldorin

3

सिल्वरलाइट रनटाइम के खिलाफ बनाए गए असेंबली को संदर्भित करना संभव नहीं है।

जिस तरह से मैंने इसे प्राप्त किया है, वह मेरे व्यापार असेंबली के लिए एक नई परियोजना बनाना है और फिर मूल वर्ग से सभी वर्गों को इसमें जोड़ना है। कुंजी यह है कि जब आप उन्हें जोड़ते हैं तो इसे मौजूदा आइटम के रूप में करते हैं और जोड़ें बटन पर नीचे तीर पर क्लिक करें और लिंक के रूप में जोड़ें। इस तरह से आपके पास अभी भी एक कोड आधार है, हालांकि आपको सिल्वरलाइट रनटाइम से गुम चीजों के लिए अनुप्रयोग अपवाद जैसे कुछ वर्गों को जोड़ना पड़ सकता है।

+0

कोडप्लेक्स से उपलब्ध एक प्रोजेक्ट लिंकर टूल भी है जो आपको स्वचालित रूप से दो परियोजनाओं को सिंक में रखने की अनुमति देता है। यह व्यावसायिक वस्तुओं के लिए आदर्श है। एसएल -> .NET जाने के लिए याद रखें, या आप उन तत्वों के साथ समाप्त होने का जोखिम उठाएंगे जो फिर से निर्मित नहीं हैं :-) –

3

संक्षिप्त उत्तर नहीं है, मुझे डर है। सिल्वरलाइट रनटाइम को .NET ढांचे का सबसेट बनाने के लिए डिज़ाइन किया गया था, लेकिन दोनों सीधे संगत नहीं हैं। (रनटाइम्स को काफी अलग तरीके से कार्यान्वित किया जाता है, मेरा मानना ​​है कि सिल्वरलाइट को क्रॉस-प्लेटफ़ॉर्म के रूप में डिज़ाइन किया गया था।)

अच्छी खबर यह है कि आपके पास पूरी तरह से कामकाज है। This blog post और this CodeProject लेख गहराई से इस मुद्दे पर चर्चा करता है और विभिन्न प्रकार के स्वच्छ समाधान प्रदान करता है। उम्मीद है कि मदद करता है ...

3

नहीं। स्रोत csproj को पता होना चाहिए कि यह एक सिल्वरलाइट प्रोजेक्ट है। इसका अर्थ यह हो सकता है कि दो प्रोजेक्ट फ़ाइलों को एक ही स्रोत ".cs" फ़ाइलों के साथ रखा जाए। यहाँ एक आसान csproj चाल है - (protobuf-net से नकल जहां मैं कई चौखटे के लिए ऐसा करते हैं):

<ItemGroup> 
    <Compile Include="..\YourMainProject\**\*.cs" /> 
</ItemGroup> 

तो आप केवल एक परियोजना को बनाए रखने की है, सिल्वरलाइट प्रोजेक्ट पेड़ से सबकुछ प्राप्त करता है।

ध्यान दें कि सिल्वरलाइट बीसीएल बहुत प्रतिबंधित है, और सभी कार्यक्षमता उपलब्ध नहीं होगी। नियमित .NET और Silverlight दोनों पर संकलित कोड प्राप्त करना ... चुनौतीपूर्ण हो सकता है।

वैकल्पिक रूप से, सिल्वरलाइट ऐप (यानी डब्ल्यूसीएफ आदि के माध्यम से) प्रॉक्सी कक्षाओं का उपयोग करें। अमीर के रूप में नहीं, लेकिन करने के लिए आसान है।

1

सिल्वरलाइट रनटाइम मुख्य .NET CLR का सबसेट है। यद्यपि यह दर्द हो सकता है, इसके लिए एक समझदार कारण है - सिल्वरलाइट रनटाइम को ब्राउज़र प्लगइन होने के लिए पर्याप्त प्रकाश होना चाहिए।

यदि आप अपने अन्य वर्गों को वेब सर्विसेज के पीछे रखते हैं तो वे पूर्ण नेट ड्राइव के दौरान दौड़ सकते हैं जबकि आपका सिल्वरलाइट एप्लिकेशन ब्राउजर प्लगइन में सीएलआर को काटकर चलाता है।

8

वास्तव में, जबकि यह मुश्किल है और शायद एक अच्छा विचार नहीं है, सिल्वरलाइट प्रोजेक्ट में सीएलआर असेंबली का संदर्भ देना संभव है। डेविड बेटज़ के पास उनके ब्लॉग पर एक उदाहरण है: http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight

फिर यह जोर देने योग्य है कि आप वास्तव में ऐसा नहीं करना चाहते हैं। सिल्वरलाइट ढांचे को अनुभवी इंजीनियरों द्वारा विकसित किया गया है, जिन्होंने बहुत कुछ सोचा है कि क्या शामिल किया जाना चाहिए और क्या नहीं होना चाहिए। सीएलआर ऑब्जेक्ट्स के बारे में सोचें जो आपको लगता है कि आपको चाहिए, और यह समझने की कोशिश करें कि वे वर्तमान में क्यों उपलब्ध नहीं हैं, और विकल्प क्या हैं।

अंत में, याद रखें कि आपके द्वारा जोड़े गए किसी भी सीएलआर ऑब्जेक्ट्स, आपके डाउनलोड के आकार को बढ़ाएंगे।

2

चेतावनी का एक शब्द है, इस पर मेरे अनुभव विंडोज फोन 7 के लिए विकसित करने से आता है, तो यह सामान्य सिल्वरलाइट 3.

JaredPar सिल्वरलाइट CLR ने कहा है सामान्य CLR के साथ असंगत है से आसानी से अलग हो सकता है। यह 100% सही नहीं है क्योंकि विंडोज लाइब्रेरीज़ के रूप में संकलित असेंबली अभी भी चांदी की रोशनी के तहत काम करेंगे, यह मानते हुए कि वे समर्थित API का उपयोग करते हैं। आप चांदी की परियोजना को मैन्युअल रूप से संपादित कर सकते हैं और सामान्य .NET असेंबली का संदर्भ जोड़ सकते हैं। ध्यान दें कि आप केवल संकलित असेंबली का संदर्भ जोड़ सकते हैं, न कि प्रोजेक्ट।

चांदी की रोशनी ऐप संकलित और दौड़ जाएगी, लेकिन जैसे ही यह सिल्वरलाइट में मौजूद कक्षा का उपयोग करने की कोशिश करता है, आपको रन-टाइम त्रुटि मिलती है।

एपीआई में अंतर प्रदर्शित करने के लिए, स्क्रीनशॉट का पालन करें। जैसा कि आप देख सकते हैं कि दो असेंबली में कुछ आम एपीआई हैं, लेकिन सिल्वरलाइट में कुछ गायब हैं। जैसे ही आपकी असेंबली उन एपीआई को मारने की कोशिश करती है, ऐप बूम जाता है!

पूर्ण .NET 4.0 mscorlib (System.serialization नाम स्थान):

Full .NET 4.0 mscorlib http://img188.imageshack.us/img188/2131/fullmscorlib.png

सिल्वरलाइट 3 mscorlib (System.serialization नाम स्थान):

Silverlight 3 mscorlib http://img526.imageshack.us/img526/4254/sl3mscorlib.png

एक पूर्ण नेट विधानसभा जोड़ने का नुकसान है कि आप रनटाइम तक नहीं जान पाएंगे जो एपीआई समर्थित नहीं हैं। यह मानते हुए कि संभावित रूप से कुछ समर्थित सिस्टम एपीआई असमर्थित सिस्टम एपीआई का उपयोग कर सकते हैं, समय से पहले इसे बाहर करने का कोई आसान तरीका नहीं है।

समानांतर विकास को आसान बनाने के लिए आप कुछ कर सकते हैं। माइक्रोसॉफ्ट द्वारा अनुशंसित दृष्टिकोण .NET और Silverlight के लिए अलग प्रोजेक्ट है जो समान स्रोत कोड साझा करता है। आप परियोजना के लिंक के रूप में फ़ाइलों को जोड़कर इसे मैन्युअल रूप से कर सकते हैं। यह एक रखरखाव दुःस्वप्न का थोड़ा सा है, लेकिन कम से कम अधिकांश त्रुटियों को संकलित समय पर पकड़ा जाएगा।

तो अब जब आप कुछ सिल्वरलाइट में लापता संदर्भ एपीआई संकलन आपको कोई त्रुटि मिलती:

public class SerializableExample: IEquatable<string>, System.Runtime.Serialization.ISerializable 
{ 
} 

error CS0234: The type or namespace name 'ISerializable' does not exist in the namespace 'System.Runtime.Serialization' (are you missing an assembly reference?)

सशर्त संकलन की मदद से

(एक-la अच्छा ol 'C/C++ दिन) आप कर सकते हैं अक्षम सामान जो समर्थित नहीं है:

public class SerializableExample: IEquatable<string> 
#if !SILVERLIGHT 
    , System.Runtime.Serialization.ISerializable 
#endif 
{ 
} 

माइक्रोसॉफ्ट भी एक परियोजना संयोजक उपकरण है जो परियोजनाओं फ़ाइलें लिंक कर लिया है के स्वत: रखरखाव के लिए अनुमति देता है प्रदान करते हैं। दुर्भाग्यवश वर्तमान रिलीज वीएस -2010 पर नहीं चलती है, आप शायद स्रोत को संकलित कर सकते हैं और ऐसा कर सकते हैं, लेकिन मैंने कोशिश नहीं की है।

http://msdn.microsoft.com/en-us/library/dd458870.aspx

डायरेक्ट डाउनलोड लिंक:

http://download.microsoft.com/download/6/3/8/6382E28D-2EBD-4A4E-BB76-6F425E1C9DB9/MicrosoftPracticesProjectLinkerFeb2009.msi

यह Microsoft page कष्टदायी विस्तार से अनेक-लक्षित करने का वर्णन है।

1

क्या आपने यह कोशिश की है? यह सीधे .NET लाइब्रेरी प्रोजेक्ट पर क्लिक करके सिल्वरलाइट असेंबली का निर्माण कर सकता है।

http://buildassilverlight.codeplex.com/

1

जवाब देने के लिए देर हो चुकी है, लेकिन assembly-level vs. file-level reuse के लिए इस लिंक जोड़ने। यह बहुत गहन है।

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

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