2012-10-23 16 views
7

में पोर्टेबल क्लास लाइब्रेरी मजबूत असेंबली संदर्भ समस्याएं मोनो टच और मोनोडायड में पीसीएल अच्छी तरह से काम करती हैं।पोर्टेबल क्लास लाइब्रेरी मोनो टच/मोनोड्रॉइड

लेकिन, कभी कभी, जब मैं एक चर का उपयोग एक पीसीएल में एक प्रकार के संदर्भ के लिए, और फिर मैं एक MonoX ग्राहक में है कि एक ही संदर्भ उपयोग करने का प्रयास है, तो संकलक की तरह एक संदेश के साथ विफल रहता है:

प्रकार 'System.Collections.Specialized.INotifyCollectionChanged' को एक असेंबली में परिभाषित किया गया है जिसका संदर्भ नहीं दिया गया है। आपको असेंबली 'सिस्टम के लिए एक संदर्भ जोड़ना होगा। विन्डोज़, संस्करण = 2.0.5.0, संस्कृति = तटस्थ, PublicKeyToken = 7cec85d7bea7798e, retargetable = Yes'। https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/System.Windows की तरह - - और स्पष्ट रूप से DLL माइक्रोसॉफ्ट के निजी कुंजी का उपयोग करके हस्ताक्षरित नहीं किया जा सकता कि

समस्या है कि यहाँ MonoDroid में मेरी System.Collections.Specialized.INotifyCollectionChanged पीसीएल एक परत प्रकार अग्रेषण DLL में प्रदान की जाती है।

कुछ अधिक जानकारी:

  • यह आमतौर पर ICommand तरह इंटरफेस के लिए देखा और
  • यह केवल .exe परियोजनाओं में होने के लिये (पुस्तकालयों किसी भी तरह ठीक काम करते हैं)
  • मैं मुख्य रूप से परीक्षण कर रहा हूँ लगता है INotifyCollectionChanged है/VS2010 और VS2012
  • में इमारत में कुछ और पर: https://github.com/slodge/MvvmCross/issues/41

anyo कर सकते हैं ने इसे हल करने का कोई तरीका सुझाया है? जैसे मजबूत असेंबली नामकरण सुरक्षा को बंद करने का कोई तरीका है?

मुझे लगता है कि पीसीएल वास्तव में माइक्रोसॉफ्ट के बाहर पोर्टेबल होने के लिए आवश्यक है। नेट कार्यान्वयन?

उत्तर

2

कमांड प्रॉम्प्ट वी.एस. एक व्यवस्थापक से, आप इस चला सकते हैं:

sn -Vr *,7cec85d7bea7798e 

यह सार्वजनिक कुंजी टोकन के रूप में 7cec85d7bea7798e के साथ किसी भी विधानसभा के लिए मजबूत नाम सत्यापन को छोड़ देगा। फिर आपको उस कुंजी के साथ अपने शिम डीएलएल पर हस्ताक्षर करने में देरी होनी चाहिए। मुझे लगता है कि आप देरी हस्ताक्षर के लिए इसका उपयोग करने के लिए डीएलएल से एक कुंजी के सार्वजनिक हिस्से को निकालने के लिए sn -pc का उपयोग कर सकते हैं।

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

ध्यान दें कि मैं एक सुरक्षा विशेषज्ञ नहीं हूं इसलिए मुझे नहीं पता कि इन Microsoft कुंजी के लिए आपकी मशीन पर मजबूत नाम सत्यापन को किस प्रकार का सुरक्षा प्रभाव अक्षम कर सकता है। मैं नहीं सोचता कोई महत्वपूर्ण प्रभाव होगा ...


विस्तृत डैनियल से ऊपर का पालन करें:

मुझे लगता है कि यह आप मोनो पर पोर्टेबल पुस्तकालयों के लिए प्रकार बंटवारे/strong नाम पर हस्ताक्षर करने के मुद्दों से बचने के लिए क्या करने की जरूरत है:

-> निकालें > डेल को संशोधित Droid system.windows परियोजना -

Sn –e "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile104\System.Windows.dll" system_windows.snk 

: System.Windows.dll की सार्वजनिक कुंजी, और Droid system.Windows परियोजना के लिए परियोजना निर्देशिका में डाल दिया निकाली गई कुंजी का उपयोग करके ऐ-साइन। निम्नलिखित रखो csproj फ़ाइल में एक PropertyGroup में:

<SignAssembly>true</SignAssembly> 
<AssemblyOriginatorKeyFile>system_windows.snk</AssemblyOriginatorKeyFile> 
<DelaySign>true</DelaySign> 

- करने के लिए> Droid System.Windows परियोजना के विधानसभा संस्करण बदलें (AssemblyInfo.cs में):

2.0.5.0 

मेरे परीक्षण में, मुझे मजबूत नाम सत्यापन अक्षम करने की आवश्यकता नहीं प्रतीत होती। इसलिए मुझे नहीं लगता कि यह नए लोगों के लिए कोई अतिरिक्त बाधाएं पेश करेगा - एक बार जब आप इन परिवर्तनों को कर लेंगे तो उन्हें केवल अपना कोड प्राप्त करने की आवश्यकता होगी और यह सही तरीके से निर्माण करेगा।

हालांकि, अगर आपको समस्याएं आ रही है, कमांड प्रॉम्प्ट वी.एस. एक व्यवस्थापक से निम्न चलाने की कोशिश:

sn -Vr *,7cec85d7bea7798e 

मुझे पता है कि यह कैसे काम करते हैं!

धन्यवाद,

डैनियल

+0

धन्यवाद। मैं कोड ठीक चला रहा हूं - इसलिए रनटाइम सत्यापन की कमी के बारे में आपका दावा सही लगता है। मुझे उन्हें समझने के लिए सावधानीपूर्वक अपने उत्तर में चरणों के माध्यम से काम करना होगा। मैंने कभी भी कोई कोड हस्ताक्षर नहीं किया है, इसलिए आपके बहुत सारे निर्देश मुझे एक विदेशी भाषा की तरह लगते हैं :) मेरे पास कुछ काम करने के बाद अधिक प्रतिक्रिया के साथ वापस आ जाएगा। – Stuart

-1

मैं, जहां मैं नेट 4.5 के लिए पीसीएल है अपने प्रोजेक्ट में इसी तरह की समस्या, Windows Phone 8, WinRT, MonoTouch और MonoDroid है जब मैं MonoDroid या MonoTouch परियोजना बनाने की कोशिश त्रुटियां निम्न हैं:

* त्रुटि 1 प्रकार 'System.Object' को उस असेंबली में परिभाषित किया गया है जिसका संदर्भ नहीं दिया गया है। आपको असेंबली 'सिस्टम का संदर्भ जोड़ना होगा। रनटाइम, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b03f5f7f11d50a3a'।

त्रुटि 2 प्रकार 'System.Enum' को उस असेंबली में परिभाषित किया गया है जो संदर्भित नहीं है। आपको असेंबली 'सिस्टम का संदर्भ जोड़ना होगा। रनटाइम, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b03f5f7f11d50a3a'।

मैंने आदेश दिया है (sn -Vr *, b03f5f7f11d50a3a), लेकिन इससे मदद नहीं मिली। मैं निम्नलिखित प्रोफाइल का उपयोग कर रहा हूं:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile78 
+0

आपको इसे वास्तव में संदर्भित करने के लिए एक नए प्रश्न के रूप में पूछने की आवश्यकता है। कोई आपकी मदद करने में सक्षम हो सकता है (@dsplaisted ने अंततः मेरी मदद की!) – Stuart

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

  • कोई संबंधित समस्या नहीं^_^