19

मुझे सिस्टम की त्रुटि मिल रही है। मेरे पास एक घटक में वैकल्पिक पैरामीटर होने के बाद MissingMethodException और दूसरा घटक जो इसे कॉल करता है क्योंकि इसे पुराने पैरामीटर के साथ कॉल नहीं किया जाता है।सिस्टम। MissingMethodException वैकल्पिक पैरामीटर जोड़ने के बाद

केवल घटक जिसमें पैरामीटर जोड़ा गया है, पैच के रूप में तैनात किया गया था। कॉलिंग घटक पुराना है क्योंकि इसमें कोई बदलाव नहीं है।

बुला घटक रन यह त्रुटि देता है जब:

अपवाद सूचना

अपवाद प्रकार: System.MissingMethodException संदेश: विधि नहीं पाया: 'LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs (System.String) '। डाटा: System.Collections.ListDictionaryInternal TargetSite: शून्य GenerateScanForm (Int32, Int32) HELPLINK: कोई स्रोत नहीं: BnBDispenseQueueProcess

जहाँ तक मुझे पता है के रूप में नए पैरामीटर वैकल्पिक है यह एक त्रुटि उठाना नहीं करना चाहिए। एक और चीज कॉलिंग घटक (EXE) विंडोज सेवा के रूप में चलाया जाता है।

हमें इसे चलाने के लिए एक बहुत ही वायर्ड वर्कअराउंड मिला। बदले गए घटक को एक बार हटाकर और कॉलिंग घटक चलाकर जो डीएलएल नहीं मिलेगा। जगह एक ही डीएलएल फिर से और घटक कॉलिंग ठीक काम करता है :)।

मुझे लगता है कि मुझे .NET के कुछ आंतरिक याद आ रही हैं।

मुझे और जानकारी चाहिए यदि अधिक जानकारी की आवश्यकता है।

+0

हमने अपनी सामान्य पुस्तकालय में से एक को वैकल्पिक परम जोड़ा। इसने सभी चल रहे मॉड्यूल तोड़ दिए (हम भाग्यशाली हैं, यह परीक्षण env पर था)। ये .net की फैंसी डेवलपमेंट टाइम फीचर्स हैं, ऐसा लगता है कि इसे इस्तेमाल करने से पहले हमें उन्हें गहराई से समझना होगा। यह पूछने के लिए धन्यवाद। – CreativeManix

+0

@ क्रिएटिवमैनीक्स कृपया मुझे अपनी खोज बताएं। क्योंकि यह पूरी तरह से समझने में सक्षम नहीं था कि यह इस तरह क्यों व्यवहार करता था। दृश्य के पीछे कुछ संकलन चाल हो सकती है – sandeep

+0

@ स्कैंडेप जॉन स्कीट के रूप में उल्लेख किया गया है, वैकल्पिक पैरा संकलित समय सुविधा हैं। कॉलर असेंबली में संकलन समय पर, वैकल्पिक पैरा मान डिफ़ॉल्ट मानों के साथ पास किए जाते हैं। इसलिए यदि आपने सामान्य लाइब्रेरी में वैकल्पिक पैरामीटर जोड़ा है तो सुनिश्चित करें कि आप कॉलर असेंबली को संकलित कर रहे हैं। यदि आप सभी कॉलर असेंबली को संकलित नहीं करना चाहते हैं तो वैकल्पिक पैराम का उपयोग न करें, इसके बजाय ओवरलोडेड विधि का उपयोग करें; – CreativeManix

उत्तर

31

केवल घटक जिसमें पैरामीटर जोड़ा गया है पैच के रूप में तैनात किया गया था। कॉलिंग घटक पुराना है क्योंकि इसमें कोई बदलाव नहीं है।

वहाँ

यह में एक परिवर्तन किया जाना चाहिए, क्योंकि पुराने कोड एक तरीका है जिसके अब मौजूद नहीं है कॉल!

जहां तक ​​मुझे पता है कि इसे कोई त्रुटि नहीं उठानी चाहिए क्योंकि नया पैरामीटर वैकल्पिक है।

एक निष्पादन समय निर्णय नहीं है यही कारण है कि - यह एक संकलन समय निर्णय है। आप इस तरह से एक विधि है:

void Foo(int x, int y = 5) 

और आप इसे इस तरह कहते हैं:

Foo(10); 

तो संकलक प्रभावी ढंग से रूपांतरित की एक कॉल में: कॉल है

Foo(10, 5); 

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

void Foo(int x) 
{ 
    Foo(x, 5); 
} 

void Foo(int x, int y) 
{ 
    ... 
} 

वैकल्पिक रूप से, आप कॉलिंग कोड का पुनर्निर्माण कर सकते हैं और साथ ही पुन: नियोजित कर सकते हैं।

मुझे आपके कामकाज का गहरा संदेह है। क्या आप निश्चित हैं कि जब आप डीएलएल को वापस स्थान पर रखते हैं तो आपने इसे पुराने संस्करण की बजाय नया संस्करण (वैकल्पिक पैरामीटर के साथ) के साथ बदल दिया है?

+0

हाँ मैं केवल नए संस्करण के साथ प्रतिस्थापित करता हूं। आपका जवाब समझ में आता है। लेकिन कामकाज की वजह से यह खुराक मेरे मामले में पूरी तरह से सच नहीं दिखता है। – sandeep

+0

@ संदीप: मैं * दृढ़ता से * संदेह करता हूं कि आपके काम के गलत निदान के निदान के बारे में कुछ है। आपने कितनी बार कोशिश की है? क्या आपने निश्चित रूप से इसे नए कोड का उपयोग करके देखा है? क्या आपने निश्चित रूप से कॉलिंग कोड को प्रतिस्थापित नहीं किया है? यह बस काम नहीं करना चाहिए - जब तक आप गतिशील टाइपिंग का उपयोग नहीं कर रहे हैं, तब तक यह * सी * में * करने के लिए कुछ भी नहीं है। –

+0

डीएलएल की प्रतिलिपि से संबंधित एक अद्यतन। – sandeep

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