c# - कक्षा PHP से पंजीकृत त्रुटि नहीं है




com comvisible (2)

ठीक है, तो कुछ और शोध के बाद मैंने इसे सोचा। Php.exe प्रक्रिया 32 बिट है COM दृश्य असेंबली को किसी भी सीपीयू के लिए संकलित किया जाता है, इसलिए यह दोनों 32 और 64 बिट अनुप्रयोगों के लिए सुलभ होना चाहिए।

समस्या यह है कि एक 64 बिट OS php.exe पर, और उस बात के लिए कोई भी 32 बिट प्रक्रिया, HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID की बजाय HKEY_CLASSES_ROOT \ CLSID में और HKEY_LOCAL_MACHINE \ Software \ Classes \ Wow6432Node \ CLSID HKEY_LOCAL_MACHINE \ Software के बजाय \ Classes \ CLSID। WOW6432 कुंजियों में रजिस्ट्री प्रविष्टियों को Windows Server 2008 पर .NET Framework v4 के साथ भेज दिया गया है जो regasm द्वारा नहीं बनाई गई हैं। Windows 7 पर वे बनते हैं, मुझे क्यों नहीं पूछें

यह भी पता चला है कि अगर मैं .NET v2.0 के लिए एक छोटे से परीक्षण विधानसभा बना रहा हूं और इसे नियामक के साथ पंजीकृत किया है जो नेटवर्क्स V2.0 के साथ जहाज़ है जो कि यह विंडोज 2008 पर Wow6432Node प्रविष्टियों को बना देता है। अजीब

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

regasm /regfile MyClassLib.dll

यह केवल 'सामान्य' 64 बिट प्रविष्टियों के साथ एक फ़ाइल MyClassLib.reg बनाता है। तब मैंने एक Windows 7 मशीन से WOW6432Node कुंजियों को निर्यात किया और उस। अब जब मैं उस रजिस्ट्री फ़ाइल को विंडोज़ 2008 में रजिस्ट्री में आयात करता हूँ तो सबकुछ ठीक काम करता है

WOW6432Node प्रविष्टियों के बारे में अधिक जानकारी के लिए देखें: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx

आशा है कि यह किसी और को कुछ समय और सिरदर्द बचाता है।

हमने एक सी # वर्ग पुस्तकालय विधानसभा बनाई है और इसे PHP से अपने तरीके कॉल करने में सक्षम होने के लिए COM दिखाई दिया है। यह ठीक काम करता था, लेकिन अब हम इसे एक विंडोज सर्वर 2008 सर्वर पर स्थापित करना चाहते थे और हम "क्लास पंजीकृत नहीं" त्रुटि में चलते रहें।

किसी भी निर्भरता समस्याओं से इनकार करने के लिए मैंने सी # में एक छोटी सी टेस्ट क्लास पुस्तकालय बनाया। क्लास लाइब्रेरी किसी भी सीपीयू के लिए बनाई गई है और यह कॉम दृश्य है (यह भी विधानसभा में सच करने के लिए कॉमविज़िबल सेट है)। टेस्ट कक्षा लाइब्रेरी में केवल एक विधि होती है जिसमें एक विधि होती है। क्लास को टेस्टलाब कहा जाता है और नाम स्थान को टेस्टलिब भी कहा जाता है। विधि को टेस्ट कहा जाता है और केवल एक स्ट्रिंग देता है।

हमने जो किया है वह निम्नलिखित है: - TestLib.dll का निर्माण किया - इसे विंडोज सर्वर 2008 मशीन पर कॉपी किया गया - इसके साथ डीएलएल पंजीकृत किया गया है: regasm / codebase TestLib.dll - regasm उपकरण सफलता संदेश देता है - PHP में हम बस कोशिश करते हैं एक नया COM उदाहरण बनाएँ:

try
{
   $test = new COM("TestLib.TestLib");
}
catch (Exception $e)
{
   die($e->getMessage());
}
  • जब हम इस परीक्षा स्क्रिप्ट को ब्राउज़र या कमांडलाइन (php -f test.php) से कहते हैं, तो हमें दोनों मामलों में "क्लास पंजीकृत नहीं" त्रुटि मिलती है

मैंने Gacutil -i का उपयोग करके GAC को TestLib जोड़ने का प्रयास किया, लेकिन कोई फायदा नहीं हुआ; अभी भी क्लास पंजीकृत त्रुटि नहीं है

फिर मैंने लक्ष्य पुस्तकालय के रूप में 4.0 के बजाय .2.0 के साथ testlibrary संकलित करने की कोशिश की, एक ही परिणाम। .NET Framework 4.0 सर्वर पर जिस तरह से स्थापित किया गया है।

कोई विचार?


यदि आप 64-बिट विंडोज पर एक 32-bit COM DLL कॉल करने का प्रयास कर रहे हैं, तो आपको इसे पंजीकृत करना होगा।

  1. अपने 32-बिट DLL को C: \ Windows \ sysWOW64 पर कॉपी करें
  2. C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll चलाएं C:\Windows\sysWOW64\regsvr32.exe your_com_32.dll

स्क्रीनशॉट के साथ थोड़ी अधिक जानकारी





comvisible