c# - reparador - Clase no registrada error de PHP
exception eolesyserror in module clase no registrada (2)
De acuerdo, entonces después de investigar un poco más lo descubrí. El proceso php.exe es de 32 bits. El ensamblado visible de COM se compila para Cualquier CPU, por lo que debería ser accesible tanto para aplicaciones de 32 como de 64 bits.
El problema es que en un SO php.exe de 64 bits y cualquier proceso de 32 bits para ese asunto, busca en HKEY_CLASSES_ROOT / Wow6432Node / CLSID en lugar de HKEY_CLASSES_ROOT / CLSID y en HKEY_LOCAL_MACHINE / Software / Classes / Wow6432Node / CLSID en lugar de HKEY_LOCAL_MACHINE / Software / Classes / CLSID. Las entradas de registro en las claves Wow6432 no son creadas por regasm que se incluye con .NET framework v4 en Windows Server 2008. En Windows 7 se crean, no me pregunten por qué.
También resultó que si creo un pequeño conjunto de prueba para .NET v2.0 y lo registro con regasm que se incluye con .NET framework v2.0, crea las entradas Wow6432Node en Windows 2008. Extraño.
Entonces mi solución es crear un archivo de registro básico en el servidor usando:
regasm /regfile MyClassLib.dll
Esto crea un archivo MyClassLib.reg con solo las entradas ''normales'' de 64 bits. Luego exporté las claves Wow6432Node desde una máquina con Windows 7 y las agregué a ese archivo .reg. Ahora cuando importo ese archivo reg en el registro en Windows 2008 todo funciona bien.
Para obtener más información sobre las entradas de Wow6432Node, visite: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx
Espero que esto le ahorre a alguien más algo de tiempo y dolores de cabeza.
Creamos un ensamblaje de biblioteca de clase C # y lo hizo COM visible para poder llamar a sus métodos desde PHP. Esto solía funcionar bien, pero ahora queríamos instalarlo en un servidor de Windows Server 2008 y seguimos caminando en el error "Clase no registrada".
Para descartar cualquier problema de dependencia, hice una pequeña biblioteca de clase de prueba en C #. La biblioteca de clases está construida para Cualquier CPU y es COM visible (también establece COMVisible en verdadero en AssemblyInfo.cs). La biblioteca de la clase de prueba solo contiene una clase con un método. La clase se llama TestLib y el espacio de nombres también se llama TestLib. El método se llama Prueba y solo devuelve una cadena.
Lo que hemos hecho es lo siguiente: - construimos el TestLib.dll - lo copiamos al equipo de Windows Server 2008 - registramos el dll con: regasm / codebase TestLib.dll - la herramienta regasm devuelve un mensaje de éxito - en PHP simplemente intentamos crear una nueva instancia COM:
try
{
$test = new COM("TestLib.TestLib");
}
catch (Exception $e)
{
die($e->getMessage());
}
- cuando llamamos a este script de prueba desde el navegador o la línea de comandos (php -f test.php) obtenemos el error "Clase no registrada" en ambos casos
También intenté agregar TestLib al GAC usando gacutil -i, pero fue en vano; aún la clase no registró el error.
Luego intenté compilar el testlibrary con .NET 2.0 en lugar de 4.0 como el framework objetivo, el mismo resultado. El .NET Framework 4.0 está instalado en el servidor por cierto.
¿Algunas ideas?
Si está intentando llamar a una 32-bit COM DLL
en Windows de 64 bits, deberá registrarla.
- Copie su DLL de 32 bits a C: / Windows / sysWOW64
- Ejecute
C:/Windows/sysWOW64/regsvr32.exe your_com_32.dll