Jestem dość początkujący w PHP i dziś odkryłem DOTNET klasy.
więc uczyłem obsługi, nadmiar w internecie, aby znaleźć jakiś przykład i wreszcie napisałem aplikację testową:PHP DOTNET piekło
- Utworzony DLL przy użyciu Framework 4.0 Client Profile
- Signed zespół z silną nazwę klucza
- Oznaczono zespół COM-Visible
jest to kod testu napisałem
using System;
namespace CSharpCOM
{
public class CSharpCOMClass
{
public string Base64(string s)
{
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(s));
}
}
}
Kompilowałem zespół, a następnie zarejestrowałem w GAC (gacutil /if fullpath\CSharpCOM.dll
).
Jeśli używam gacutil /l CSharpCOM
widzę
La cache di montaż globale contiene montaż gli seguenti:
csharpcom, Version = 1.0.0.0, Culture = neutral, TokenKluczaPublicznego = beb607ae770f5750, processorArchitecture = MSILNumero di elementi = 1
Wszystko wydaje się więc w porządku.
Potem napisał tę podstawową 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";
}
?>
Cokolwiek staram, Ładowanie strony hostowane w Apache (http://localhost/test01/dotnet.php
) zawsze dotrzesz
Caught wyjątku: Nie można utworzyć wystąpienia obiektu .NET [CreateInstance] [ 0x80070002] Impossibile trovare il fileatonato.
Tłumaczenie może być: nie można odnaleźć określonego pliku
Kolejna sprawa: korzystając jakiś przykład (bardzo prosty jeden here) Czytałem, że mój zespół (po zarejestrowaniu) powinny znajdować się na %windir%\assembly
, ale jestem jest tylko w stanie go znaleźć w %windi%\Microsoft.NET\assembly\GAC_MSIL\CSharpCOM\v4.0_1.0.0.0__beb607ae770f5750
: czy to prawda? Dlaczego nie mam go w pierwszym katalogu?
Więcej: jeśli utworzę inny projekt ramowy i spróbuję dodać odniesienie do .NET, nie mogę znaleźć mojego zestawu: czy jest to związane z tym, że nie mogę załadować tego zestawu z PHP?
Ostatnia uwaga: Próbowałem go na Windows XP Professional SP3 32bit i Windows Seven Enterprise 64bit
UPDATE:
to działa:
$form = new DOTNET('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');
ale ten nie:
$form = new DOTNET('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'System.Windows.Forms.Form');`
Czy to możliwe, że PHP może załadować tylko moduł 2.0? es?
kontrola negatywna: można załadować klas z istniejący montaż, np mscorlib? Wygląda na to, że problemem nie jest PHP, ale raczej to, że twój zespół nie został poprawnie zarejestrowany. –
tak, mogę użyć '$ stack = new DOTNET (" mscorlib "," System.Collections.Stack ");' – Marco
OK, pytanie uzupełniające: czy można wczytać istniejący, podpisany zespół, podając jego pełną nazwę w PHP (w tym klucz publiczny)? –