Wednesday, April 18, 2012

PHP DOTNET hell

I'm quite a newbie in PHP and today I discovered DOTNET class.

So I studied manual, surfed the web to find some example and finally wrote my test app:




  1. Created a new DLL using Framework 4.0 Client Profile

  2. Signed the assembly with a strong name key

  3. Marked assembly as COM-Visible



This is the test code I wrote



using System;

namespace CSharpCOM
{
public class CSharpCOMClass
{
public string Base64(string s)
{
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(s));
}
}
}


I compiled the assembly and then registered in GAC (gacutil /if fullpath\CSharpCOM.dll).

If I use gacutil /l CSharpCOM I see




La cache di assembly globale contiene gli assembly seguenti:

csharpcom, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=beb607ae770f5750, processorArchitecture=MSIL



Numero di elementi = 1




So everything seems ok.

Then wrote this basic php:



<?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";
}
?>


Whatever I try, loading page hosted in Apache (http://localhost/test01/dotnet.php) I always get




Caught exception: Failed to instantiate .Net object [CreateInstance]
[0x80070002] Impossibile trovare il file specificato.

Translation could be: unable to find specified file




Just another thing: using some example (a very basic one here) I read that my assembly (when registered) should be found on %windir%\assembly, but I'm only able to find it in %windi%\Microsoft.NET\assembly\GAC_MSIL\CSharpCOM\v4.0_1.0.0.0__beb607ae770f5750: is this correct? Why don't I have it on first directory?



More: if I create another framework project and try to add a .NET reference I can't find my assembly: is this related to the fact I'm not able to load this assembly from PHP?



Last note: I tried it on Windows XP Professional SP3 32bit and on Windows Seven Enterprise 64bit



UPDATE:

This works: $form = new DOTNET('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');





No comments:

Post a Comment