.NET-Bibliotheken aus PHP aufrufen

Bei meiner Arbeit standen wir kürzlich vor der Aufgabe, eine Windows-.NET-DLL-Funktion aus PHP anzusprechen. Interessanterweise ist die COM-Unterstützung bei allen geläufigen PHP-Versionen für Windows seit Version 4 bereits eingebaut. Auch eine .NET-Unterstützung ist vorgesehen, jedoch schlecht dokumentiert. Dieser Beitrag soll den aktuellen Stand unserer Bemühungen dokumentieren.

Voraussetzung
Nur der Zend Server Community Edition bringt im Moment ein PHP 5.3.5 mit aktivierter .NET-Unterstüzung mit: Die Extension com_dotnet ist enabled.
Weder XAMPP noch WAMP haben diese von sich aus einkompiliert.

Anforderungen an die DLL
Um eine .NET-DLL mit dieser Extension ansprechen zu können, muss sie folgende Anforderungen erfüllen:

  • Die .NET-Frameworkversion darf maximal 3.5 sein. .NET 4.0 funktioniert aktuell nicht.
  • Die DLL muss streng benannt und signiert sein (strongly named & signed)
  • Die Funktionen der DLL müssen COM accessible sein (Kann in den Assembly informations aktiviert werden.)
  • Die DLL muss sich im Global Assembly Cache/GAC befinden. Mit dem Kommandozeilenbefehl gacutil /i NAME.dll wird sie dort hin befördert.

Der letzte Punkt ist wahrscheinlich auch der Grund, warum PHP keine 4.0-DLLs schluckt: Im Gegensatz zum alten GAC unter c:/Windows/assembly befindet sich der neue GAC unter c:/Windows/Microsoft.NET/assembly. Je nach Frameworkversion landet die DLL automatisch im richtigen GAC, wird aber von PHP nur im ersteren gesucht.

Verwendung
Um eine .NET-Klasse aus einer DLL zu instanzieren, benötigt man den vollen Namen der Assembly und den kompletten Klassennamen. Ein Tool wie ILSpy hilft dabei, diesen herauszufinden und wie folgt zu verwenden:

$obj = new DOTNET('Voller.Assembly.Name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463', 'Voller.Assembly.Name.Klassenname');
 
echo $obj->MeineMethode();

Da mit dieser Extension immer eine Klasse instanziert wird, sind dementsprechend nur Klassenmethoden aufrufbar. Statische Klassen und Methoden funktionieren nicht und erzeugen nur kryptische Fehlermeldungen.

Ich hoffe, mit diesem Artikel anderen Benutzern dieser exotischen Kombination von Systemen etwas weitergeholfen zu haben. Kommentare und Anmerkungen sind herzlich willkommen.