2009-05-17 13 views
13

मुझे कुछ विरासत 32-बिट कोड को एकीकृत करने की आवश्यकता है - जिसके लिए मेरे पास स्रोत कोड नहीं है, इस तरह से एक परियोजना में इसे 64-बिट .NET असेंबली से बुलाया जा सकता है। मूल कोड को डीएलएल में 32-बिट COM ऑब्जेक्ट के रूप में कार्यान्वित किया जाता है। विंडोज 64 से 32-बिट ऑब्जेक्ट्स से सीधी कॉल की अनुमति नहीं देता है, इसलिए मैं इस स्थिति से निपटने के तरीके पर प्रेरणा की तलाश में हूं।64 से 32 बिट इंटरऑप - कैसे?

64-बिट .NET असेंबली से विरासत 32-बिट COM ऑब्जेक्ट का उपयोग कैसे किया जा सकता है?

अद्यतन: हमने पाया कि COM घटक स्वयं कुछ एएनएसआई सी के चारों ओर एक रैपर था, जिसे हम मूल स्रोत के लिए तैयार करते हैं। हम विजुअल स्टूडियो में मूल 64-बिट डीएल के रूप में संकलित करने में सक्षम थे, और .NET में आयात करते हैं - लक्ष्यपोस्ट को स्थानांतरित करने के लिए खेद है!

+0

टिप्पणी, क्योंकि मैंने इसे नहीं किया है, लेकिन आपको यह सुनिश्चित करना होगा कि आप COM ऑब्जेक्ट को आउट-ऑफ-प्रोसेस सर्वर के रूप में चलाएं। यदि आप इसे प्रक्रिया के रूप में लोड करते हैं, तो यह 64-बिट के रूप में चल रहा है, जो असफल हो जाएगा। –

उत्तर

8

सबसे अच्छा तरीका प्रक्रिया से बाहर निकलना है COM सर्वर जो आपके 32-बिट DLL को लपेटता है। फिर आप इसे 64 बिट कोड से कॉल कर सकते हैं।

Here is an explanation बुनियादी अवधारणाओं के।

+0

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

3

आपको क्या करना है आईपीसी के साथ संचार करने वाली दो प्रक्रियाएं बनाना है। इस तरह, कोई 32 बिट हो सकता है, और एक 64 बिट हो सकता है। आपको एक 32 प्रोग्राम बनाने की आवश्यकता है जो COM ऑब्जेक्ट से लिंक करता है और कुछ आईपीसी तंत्र जैसे नामित पाइप के माध्यम से अपना एपीआई उजागर करता है। इस प्रकार आपका .NET प्रोग्राम इसे किसी अन्य प्रक्रिया से एक्सेस कर सकता है।

+0

यह दृष्टिकोण काम करता है, हालांकि यदि आप पहले ही COM का उपयोग कर रहे हैं, तो COM इंटरॉप का उपयोग करने के बजाय नामित पाइप पर क्यों स्विच करें? –

+0

@ रीड कॉपसी: ओह, हाँ, निश्चित रूप से आप COM के लिए इसका उपयोग कर सकते हैं। लेकिन मेरा दृष्टिकोण अधिक सामान्य है; यह सामान्य पुस्तकालयों के लिए भी काम कर सकता है। – Zifre

+0

मैंने नामित पाइप्स का उपयोग करके आईपीसी करने के लिए डब्ल्यूसीएफ का उपयोग करने का विचार किया। केवल समस्या यह है कि, पाइप के दोनों सिरों को एक ही इंटरफ़ेस परिभाषा को देखने की आवश्यकता होती है, जिसे 32-बिट असेंबली में होना चाहिए। जब आप इसे चलाने का प्रयास करते हैं तो पूरी चीज विस्फोट हो जाती है। –

3

यह blog post देखें। आप एक रनटाइम कॉल करने योग्य रैपर का उपयोग कर 64 बिट .NET अनुप्रयोग से 32 बिट COM असेंबली का संदर्भ दे सकते हैं। लघु संस्करण पीछा कर रहा है ...

  1. उपयोग TLBIMP.exe एक 64 बिट क्रम प्रतिदेय आवरण बनाने के लिए:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. रजिस्टर कॉम विधानसभा (नहीं RCW) यदि आप पहले ऐसा नहीं किया:।

    regsvr32.exe foo.dll

  3. संदर्भ RCW (जैसे Interop.Foo.dll) आपके आवेदन से। अपने बिल्ड कॉन्फ़िगरेशन को x64 में बदलें और 'रॉक' दें।

+0

यह मूल समस्या का समाधान नहीं है। –

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