2012-03-14 12 views
8

से COM के माध्यम से सी # ऑब्जेक्ट के इंस्टेंटेशन के लिए कक्षा पंजीकृत नहीं है, एक वीसी ++ प्रोजेक्ट में, मैं एक सी # प्रोजेक्ट में निहित सी # कक्षा के एक उदाहरण (COM के माध्यम से) बनाने की कोशिश कर रहा हूं।वीसी ++

तथ्य

  • दोनों सी # और सी ++ परियोजनाओं का उपयोग कर .NET 4.0
  • सी # .dll regasm/codebase "CSharpProjectName.dll" "का उपयोग पंजीकृत किया जा रहा है संकलित किए जाते हैं, और खिड़कियों शीघ्र कमान रिपोर्ट, "प्रकार सफलतापूर्वक पंजीकृत।"
  • सी ++ में परियोजना, मैं सी # परियोजना में एक वर्ग का एक उदाहरण बनाने का प्रयास है, लेकिन मैं 0x80040154 के HRESULT मिल - वर्ग पंजीकृत नहीं

यहां सी #। डीएल से .NET ऑब्जेक्ट का उदाहरण बनाने के मेरे प्रयास का एक उदाहरण दिया गया है।

CSharpProjectName::IPersonPtr pPersonPtr; 
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee); 

क्यों मैं एक "वर्ग पंजीकृत नहीं है" त्रुटि भी हो रही है हालांकि मैं पंजीकृत हूँ: ठोस वर्ग मैं का दृष्टांत कोशिश कर रहा हूँ कर्मचारी, जो केवल मेरे सवाल को पेश करने के लिए, लागू करता IPerson इंटरफ़ेस कहा जाता है सी #। डीएल "regasm/codebase" का उपयोग कर रजिस्ट्री में कुंजी के अस्तित्व की पुष्टि की?

किसी भी मदद की सराहना की जाएगी। धन्यवाद!

+0

के साथ आपको डीएल पंजीकृत करने के लिए मुझे यह सही समस्या है! – TinyRacoon

उत्तर

9

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

रजिस्ट्री में अपने प्रोगिड्स और सीएलएसआईडी को खोजने और खोजने के लिए regedit का उपयोग करें। यदि आपकी सी ++ प्रोजेक्ट 32-बिट है, तो सुनिश्चित करें कि आपकी सी # कक्षा 32-बिट हाइव - HKEY_CLASSES_ROOT \ Wow6432Node पर पंजीकृत थी। यदि आपकी सी ++ परियोजना 64-बिट है, तो सुनिश्चित करें कि आपकी सी # कक्षाएं 64-बिट हाइव - HKEY_CLASSES_ROOT पर पंजीकृत थीं।

आप 64-बिट छत्ता के लिए रजिस्टर करने की आवश्यकता है, तो आप ग के तहत Regasm.exe के संस्करण कॉल करने के लिए आवश्यकता हो सकती है: \ windows \ microsoft.net \ framework64 ...

अन्य बातों के लिए संभावना गलत होने के लिए आपको regasm.exe के .NET 4.0 संस्करण को चलाने की आवश्यकता हो सकती है। यदि आप कमांड लाइन में बस "regasm" टाइप करते हैं, तो यह आपको उस रेजिमेंट का संस्करण देगा जो आप चल रहे हैं। आपको regasm के .NET 4.0 संस्करण का पूरा पथ टाइप करना पड़ सकता है - c: \ windows \ microsoft.net \ framework \ v4.0.3019 \ regasm.exe पर पाया गया। 32 बिट में अपनी परियोजना छोड़

+1

वह था! मैं v2.0 ... regasm के बजाय v2.0 ... regasm का उपयोग कर रहा था। आपका बहुत बहुत धन्यवाद! – BigSauce

+0

इसलिए, यदि आवश्यक सीएलआईडी 914 9 3441-5A91-11CF-8700-00AA0060263B है, और खोज करने के बाद इसे वर्तमान रजिस्ट्रीज़ (regedit) के बीच नहीं मिल सकता है? –

1

क्या आपने /tlb विकल्प का प्रयास किया है? इसे आज़माएं, और फिर

#import "your_tlb_file_lol.tlb" no_namespace 

मुझे लगता है कि दूसरा विकल्प असेंबली को पकड़ने और फिर इसे रद्द करने के लिए हो सकता है।

+0

मैंने कोशिश की कि ** # आयात "CSharpProjectName.tlb" name_guids raw_interfaces_only ** का उपयोग कर। अभी भी काम नहीं किया ... – BigSauce

0

कोशिश करने के लिए है क्योंकि आप अपनी परियोजना जानते हैं, किसी भी सीपीयू में एक सक्रिय घटक है कि एक रजिस्ट्री त्रुटि के साथ 32 से चलता बनाने, इसलिए 32.

आप 32 के निर्माण बदलने के लिए या अधिमानतः Regsvr32

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