Soy bastante novato en PHP y hoy descubrí DOTNET clase.
Así que estudiaron manual, navegado por la web para encontrar algún ejemplo y finalmente escribió mi aplicación de prueba:PHP DOTNET hell
- Creado un nuevo archivo DLL usando Framework 4.0 Client Profile
- Firmado el ensamblado con un nombre fuerte clave
- Asamblea marcado como COM-Visible
Este es el código de prueba que escribí
using System;
namespace CSharpCOM
{
public class CSharpCOMClass
{
public string Base64(string s)
{
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(s));
}
}
}
Compilé el ensamblaje y luego me registré en GAC (gacutil /if fullpath\CSharpCOM.dll
).
Si uso gacutil /l CSharpCOM
veo
La caché di ensamblaje globale montaje gli Contiene seguenti:
csharpcom, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = beb607ae770f5750, processorArchitecture = MSILNumero di elementi = 1
Así que todo parece estar bien.
Luego escribió este php básica:
<?php
try{
$csclass = new DOTNET("CSharpCOM, Version=1.0.0.0, Culture=neutral, " .
"PublicKeyToken=beb607ae770f5750",
"CSharpCOM.CSharpCOMClass");
echo $csclass->Base64("Test string"),"\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
?>
Cualquiera que sea lo intento, carga de la página alojada en Apache (http://localhost/test01/dotnet.php
) siempre me dan
excepción capturada: No se pudo crear una instancia de objeto de .NET [CreateInstance] [ 0x80070002] Imposibile trovare il file specificato.
traducción podría ser: no se puede encontrar el archivo especificado
Sólo otra cosa: el uso de algún ejemplo (a uno muy básico here) leí que mi montaje (al ser registrados) se debe encontrar en %windir%\assembly
, pero estoy solo puede encontrarlo en %windi%\Microsoft.NET\assembly\GAC_MSIL\CSharpCOM\v4.0_1.0.0.0__beb607ae770f5750
: ¿es correcto? ¿Por qué no lo tengo en el primer directorio?
Más: si creo otro proyecto de framework y trato de agregar una referencia .NET no puedo encontrar mi ensamblado: ¿está relacionado con el hecho de que no puedo cargar este ensamblado desde PHP?
Última nota: Lo probé en Windows XP Professional SP3 de 32 bits y en Windows Siete empresas de 64 bits
ACTUALIZACIÓN:
Esto funciona:
$form = new DOTNET('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');
pero éste no lo hace:
$form = new DOTNET('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');`
Es posible que PHP solo pueda cargar framework 2.0 assembli es?
Control negativo: ¿Se puede cargar las clases de un conjunto existente, por ejemplo mscorlib? Parece que el problema aquí no es PHP, sino que su ensamblaje no está registrado correctamente. –
sí, puedo usar '$ stack = new DOTNET (" mscorlib "," System.Collections.Stack ");' – Marco
OK, pregunta de seguimiento: puede cargar un ensamblaje existente y firmado, proporcionando su nombre completo en PHP (incluida la clave pública)? –