2016-02-12 7 views
7

ध्यान दें कि यह this question का डुप्लिकेट हो, मुझे पूरी तरह से यकीन नहीं है।कोड अनुबंध पुनर्लेख 'सदस्य संदर्भ को हल नहीं कर सका'

मेरी समस्या यह है कि मेरे पास एक क्लास लाइब्रेरी प्रोजेक्ट है जिसमें किसी तृतीय-पक्ष प्रकार लाइब्रेरी (COM) का संदर्भ है। मैं तो जैसे, वर्ग पुस्तकालय में तरीकों में ठेके रखना चाहता हूँ:

public class foo 
{ 
    public static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

और फिर एक ग्राहक परियोजना है इस विधि, उदा का इस्तेमाल करते हैं

var n = foo.divide(null, 4, 2); 

लेकिन मुझे यह भी पसंद है कि क्लाइंट प्रोजेक्ट भी इसके कुछ तरीकों से अनुबंध का उपयोग करे। इसलिए, मैंने दोनों परियोजनाओं पर कोड अनुबंध अनुबंधों को 'रनटाइम कॉन्ट्रैक्ट चेकिंग' करने के लिए सेट किया है (जिसके बिना आपको रनटाइम जोर देता है कि आपको यह सेटिंग चाहिए)।

अब, जब मैं तो ग्राहक को संकलित करने का प्रयास करें, मैं निम्नलिखित त्रुटि मिलती है:

Could not resolve member reference: my_class_lib.foo::divide.

ccrewrite : error : Rewrite aborted due to metadata errors.

कौन सा अपरिहार्य लगता है - किसी भी समय जो तीसरे पक्ष के प्रकार लायब्रेरी से एक प्रकार है एक विधि कहा जाता है ऐसा होता है । विधि के हस्ताक्षर से प्रकार निकालें और यह ठीक है।

क्या कोई यह समझा सकता है कि ऐसा क्यों होता है? क्या यह एक सुराग है कि मेरे कोड की संरचना मूल रूप से त्रुटिपूर्ण है (यदि हां, क्यों?), या यह कोड अनुबंधों का एक प्रश्न है? क्या इस समस्या के लिए कोई अनुशंसित फिक्स है?

+0

मुझे यह त्रुटि क्रिकराइट से मिल रही है, पहली पार्टी लाइब्रेरी में विधियों से जो उनके हस्ताक्षर में इंटरऑप प्रकार एम्बेडेड हैं। – JamesFaix

+0

मैंने अपना प्रोजेक्ट वीएस2015 में खोला था और वीएस2013 पर स्विच किया था और यह मुद्दा चला गया था। Roslyn संकलक पुराने कंपाइलर की तुलना में एम्बेडेड इंटरऑप प्रकारों का अलग-अलग व्यवहार करता है, लेकिन मुझे इसके बारे में कोई दस्तावेज़ीकरण या वार्तालाप नहीं मिल रहा है। संभवतः संबंधित: http://stackoverflow.com/questions/35641972/why-does-visual-studio-2015-throw-more-cs1769-compiler-errors-than-vs2013 – JamesFaix

+0

कोड अनुबंधों का कौन सा संस्करण आपने स्थापित किया है? 26 जनवरी, 2016 को v.1.10.10126.2-rc1 के रिलीज होने तक मुझे विजुअल स्टूडियो 2015 में काम करने वाले कोड अनुबंधों में कभी भी रनटाइम जांच नहीं मिली है। यह संस्करण कोड अनुबंधों की पहली बड़ी समुदाय संचालित रिलीज है और बहुत कुछ संबोधित करता है लंबित मुद्दों का। इसे डाउनलोड किया जा सकता है: https://github.com/Microsoft/CodeContracts/releases। मैंने इसे स्थापित किया है और रनटाइम जांच अब मेरे लिए काम करता है। –

उत्तर

2

ईमानदारी से कहूं तो मैं नहीं पता है क्यों ccrewrite इंटरॉप प्रकार के साथ एक समस्या है, लेकिन मैं आप 3 समाधान दे सकते हैं:

समाधान 1

यह एक सरल है:

  • किसी प्रोजेक्ट के संदर्भों की सूची पर जाएं।
  • तृतीय-पक्ष प्रकार लाइब्रेरी खोजें।
  • राइट क्लिक करें।
  • संदर्भ मेनू से गुण चुनें।
  • बदलें इंटरप प्रकार ट्रू से गलत तक एम्बेड करें।

आपको दोनों परियोजनाओं के लिए ऐसा करना है। इस समाधान की कमी यह है कि निर्माण के बाद आपको बिन फ़ोल्डर में अतिरिक्त इंटरऑप असेंबली मिल जाएगी।

समाधान 2

एक अन्य समाधान एक सार्वजनिक इंटरफ़ेस यानी से एक तीसरे पक्ष के प्रकार लायब्रेरी से प्रकार दूर करने के लिए हो सकता है:

public class foo 
{ 
    public static int divide(int a, int b) 
    { 
     return divide(null, a, b); 
    } 

    private static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

बेशक आपको लगता है कि आप नहीं है केवल तभी कर सकते हैं अपने क्लाइंट में TypeFromTypeLib का उपयोग करने की आवश्यकता है।

समाधान 3

आप अपने ग्राहक में TypeFromTypeLib उपयोग करने के लिए आप इस वर्ग यानी के लिए एक आवरण लिख सकते हैं .: जरूरत है

public class MyTypeFromTypeLib 
{ 
    //... 
} 

public class foo 
{ 
    public static int divide(MyTypeFromTypeLib mytftl, int a, int b) 
    { 
     var tftl = new TypeFromTypeLib(); 
     //Map MyTypeFromTypeLib to TypeFromTypeLib 
     //... 
     return divide(tftl , a, b); 
    } 

    private static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

हालांकि, इस समाधान बोझिल है क्योंकि अतिरिक्त कक्षाओं की जरूरत है।

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