2016-07-20 9 views
5

मेरे पास कुछ वीबी 6 कोड है जो मुझे धीरे-धीरे .NET पर जाने की आवश्यकता है। इनमें से कुछ को वेब पर कॉल की आवश्यकता है। मैं एक .NET डीएल से वेब कॉल कर रहा हूं, और जब यह हो जाता है, तो यह एक घटना को फायर करता है। मैं वीबी 6 में घटना को संभालता हूं। अब यह मेरी टेस्ट मशीन पर और उपयोगकर्ता की अधिकांश मशीनों पर ठीक काम करता है, लेकिन कुछ उपयोगकर्ताओं को घटना के दौरान कुछ समय के दौरान प्रोग्राम का लगातार क्रैश मिलता है।मैं .NET में एसिंक कोड और ईवेंट को सुरक्षित रूप से कैसे चला सकता हूं ताकि वीबी 6 इसे संभाल सके?

मुझे लगता है कि यह एक थ्रेडिंग मुद्दा है। तो मैं चीज़ों के .NET पक्ष पर धागे को कैसे संभालना चाहिए? .NET कोड कहलाता है और मुझे लगता है कि यह मुद्दा हो सकता है जब कोई सिंक्रनाइज़ेशन संदर्भ नहीं है। मैं वीबी 6 कॉलिंग थ्रेड पर एसिंक ऑपरेशन कैसे वापस प्राप्त करूं? मेरा वीबी 6 कोड एसटीए है और मैंने पढ़ा है कि COM को स्वचालित रूप से COM के माध्यम से VB6 थ्रेड पर मार्शल किया जाएगा, लेकिन हो सकता है कि यह गलत था? मैं पूरी तरह से समझ नहीं पा रहा हूं कि अगर यह वास्तव में एक थ्रेडिंग मुद्दा है तो क्या करना है।

मैं ऐसे पैटर्न को खोजने में सक्षम नहीं हूं जिसके लिए कंप्यूटर में क्रैश समस्या है और कौन सा नहीं है।

+2

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

+1

हम्म मैं इसे वीबी 6 फॉर्म से कैसे प्राप्त करूं? मैं .NET – bzuillsmith

+2

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

उत्तर

2

तो मैंने बाद में पाया कि मुझे गलत जानकारी मिली थी और यह कुछ डेवलपर मशीनों को छोड़कर सभी उपयोगकर्ता की मशीनों पर बहुत अधिक काम नहीं कर रहा था। मुद्दा .tlb फ़ाइल जेनरेट और पंजीकृत नहीं किया जा रहा था।

ऐसा लगता है कि यदि आप मुख्य धागे से घटनाओं को आग लगते हैं, तो सब कुछ ठीक है।

  1. आप, मुख्य थ्रेड पर इसे वापस ला सकता है शायद किसी फ़ॉर्म में कोई SynchronizationContext के माध्यम से: लेकिन अगर आप आग की घटनाओं अतुल्यकालिक रूप से आप इसे क्रैश होने के बिना काम कर सकते हैं केवल दो तरीके हैं।
  2. आप किसी भी धागे से ईवेंट को फायर कर सकते हैं और इसे स्वचालित रूप से VB6 के STA थ्रेड पर वापस ला सकते हैं, लेकिन इसे अतिरिक्त tlb जानकारी की आवश्यकता होती है जो रजिस्ट्री में नहीं है यदि आप केवल tlb विकल्प के बिना DLL को पंजीकृत करते हैं। यह विकल्प अच्छा है अगर आप किसी भी UI थ्रेड से नहीं जाते हैं जो सिंक्रनाइज़ेशन कॉन्टेक्स्ट सेट करता है।

ध्यान दें कि यदि आप reg-free COM का उपयोग कर रहे हैं, तो विकल्प 2 को आपके असेंबली के मेनिफेस्ट में comInterfaceExternalProxyStub तत्व की आवश्यकता है। question and answer here

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