2009-03-20 9 views
6

मैं डेटा जेनरेटर के रूप में कुछ जेनेरिक कक्षाओं का उपयोग कर रहा हूं, और एक डब्ल्यूसीएफ सेवा से डेटा पास करने के लिए उनका उपयोग कर रहा हूं। डब्ल्यूसीएफ जिस तरह से क्लाइंट साइड पर जेनेरिक नामों को "ListOfBlah231546797646" नामक वर्ग में नामित करता है, वैसे ही मैं वास्तविक असेंबली को "ज्ञात टाइप" के रूप में संदर्भ जोड़ रहा हूं।सिल्वरलाइट और "सादा वेनिला" के बीच असेंबली साझा करना .नेट

सिल्वरलाइट इन सेवाओं का उपभोग करने की आवश्यकता है, लेकिन केवल "Silverlight assemblies" का संदर्भ दे सकता है। मैंने कक्षाओं को अपनी "चांदी की रोशनी असेंबली" में स्थानांतरित कर दिया है और उन्हें चांदी की रोशनी से संदर्भित कर सकते हैं, लेकिन जब सेवा चलती है तो मुझे सिस्टम पर "संदर्भित असेंबली नहीं मिल सकती" त्रुटि मिलती है। रनटाइम। सिराइलाइजेशन असेंबली।

यह पता चला है कि सिल्वरलाइट में यह द्विआधारी का सेट है, सभी लेबल संस्करण 2.0.5.0 है। ये सेवा के जीएसी में नहीं हैं और इसलिए अपवाद फेंक दिया गया है।

इस वजह से मैं अपनी सेवा के कोड से "सिल्वरलाइट असेंबली" का संदर्भ नहीं दे सकता। क्या इस मुद्दे के आसपास मैं कोई रास्ता प्राप्त कर सकता हूं, जिससे दो स्वादों को क्रमबद्ध करने पर संगत हो जाता है?

यह प्रश्न समान है, लेकिन कोई भी जवाब मदद नहीं करते हैं। कोई विचार? similar question

उत्तर

3

जिस तरह से मैं सिल्वरलाइट और सामान्य सीएलआर के बीच कोड साझा करता हूं, सी # परियोजनाओं के साथ "लिंक के रूप में जोड़ें" सुविधा का उपयोग करना है। तो यह इस तरह दिख रहा है:

| SilverlightLib 
| File1.cs 
| File2.cs 
| ClrLib 
| File1.cs <as link> 
| File2.cs <as link> 

फिर वीएस ठीक काम करता है, और कोड के दोनों सेट संकलित हो जाते हैं। कष्टप्रद हिस्सा वह जगह है जहां सिल्वरलाइट ढांचा लाइन नहीं है। (डब्ल्यूसीएफ में कुछ हिस्सों हैं जो एसएल में मौजूद नहीं हैं।) उस स्थिति में, कोड को दोनों प्लेटफार्मों को लक्षित करने के लिए आपको प्रीप्रोसेसर "#if सिलवरलाइट" का उपयोग करने की आवश्यकता होगी।

इसने अब तक बहुत अच्छी तरह से काम किया है। इस तरह, मैं कोड लिख सकता हूं, वीएसटीएस के साथ परीक्षण कर सकता हूं, लेकिन फिर भी यह उसी स्रोत से एसएल पर काम करता है।कुछ टिप्स:

  • हमेशा एसएल प्रोजेक्ट से संपादित करें - इस तरह संपादक संपादक को एसएल तक सीमित कर देगा, और आपको बाद में आश्चर्य नहीं मिलेगा।
  • कभी-कभी आपको अन्य प्रोजेक्ट में अपडेट करने के लिए इंटेलिजेंस के लिए खोला गया फ़ाइल बंद करना होगा।
+0

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

1

पिछले दो तरीकों से मैंने इसे पहले किया है।

पहला और सबसे आसान। सिल्वरलाइट में सेवा संदर्भ के रूप में डब्ल्यूसीएफ सेवा जोड़ें। यह सभी वर्ग पुस्तकालयों को पुन: उत्पन्न करने और आवश्यकता होने पर उन्हें ताज़ा करने का ख्याल रखेगा।

दूसरा, कक्षाओं की दो प्रतियां, चांदी की रोशनी में से एक और नेट 3.5 क्लियर में स्टोर करें। फिर सुनिश्चित करें कि डेटा कंट्रैक्ट नाम और नेमस्पेस मेल खाते हैं। यदि आप Silverlight में ServiceReference जोड़ते हैं तो एक्सप्लोरर में ServiceReference फ़ोल्डर देखें और संदर्भ.cs फ़ाइल देखें, आपको जेनरेट की गई कक्षाएं दिखाई देगी और उनको कॉपी कर सकती हैं।

+0

यह वास्तव में काम नहीं करेगा क्योंकि मेरी कक्षाएं जेनेरिक हैं। मेरे MyClass की बजाय मुझे MyClassOfType12315125 जैसे कुछ मिलता है। मुझे नहीं लगता कि दूसरा विकल्प सीरियलाइजेशन के तरीके के कारण काम करेगा। मुझे विश्वास नहीं है कि नेट सोचेंगे कि प्रकार समान हैं। –

+0

क्या आप एक सेवा संदर्भ जोड़ सकते हैं और आउटपुट की जांच कर सकते हैं? – bendewey

+0

आपका क्या मतलब है? जेनरेट की गई प्रॉक्सी क्लास जेनेरिक का उपयोग नहीं करती है और मैंने जो उदाहरण दिया है, वह बहुत ही नामित है। –

0

सुनिश्चित नहीं है कि यह आपके परिदृश्य में संभव है, लेकिन क्या आपने अपने ऑब्जेक्ट्स को जेसन के रूप में अपने Silverlight क्लाइंट में क्रमबद्ध करने के बारे में सोचा है? फिर अपने Silverlight ऐप में आप Silverlight में JsonObject का उपयोग कर सकते हैं। इस तरह आप अपने Silverlight ऐप में मॉडल ऑब्जेक्ट्स का एक और सेट रखने से बचें।

JsonObject user = (JsonObject)JsonObject.Load(responseStream); 
bool isMember = user["IsMember"]; 
string name = user["Name"]; 
int age = user["Age"]; 

उदाहरण से this msdn sample

इस विधि की अच्छी बात यह भी आप Silverlight में LINQ समर्थन है है है, और यह रूप में अच्छी तरह से अपने ajax ग्राहकों द्वारा प्रयोग करने योग्य है। यह क्लाइंट पर चल रहे चांदी की रोशनी ऐप पर आपकी वास्तविक वस्तुओं को उजागर करने से भी अधिक सुरक्षित है।

+0

जेएसओएन जेनरिक का समर्थन करता है? –

+0

यदि आप सूची को क्रमबद्ध करते हैं तो आपको JSON में MyObject की एक सरणी मिल जाएगी। तो सीरिएलाइज़र जेनेरिक सूचियों का समर्थन करता है, मुझे यकीन नहीं है कि यह MyGenericClass को क्रमबद्ध करने में कैसे संभाल करेगा। – Dan

+0

मैं मानक साबुन सेवा संदर्भ के साथ कुछ मिल सकता है। मुझे यह पसंद नहीं है कि यह एक बदसूरत सजाए गए नाम को कैसे बनाता है, और मेरे असली, सच्ची कक्षा में किसी भी तर्क का उपयोग नहीं कर सकता है। मुझे पता है कि यह "सत्य" एसओए नहीं है, लेकिन मेरे पास सर्वर और क्लाइंट दोनों का मालिक है और कोड –