downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

VARIANT> <COM
Last updated: Fri, 20 May 2011

view this page in

DOTNET

(PHP 4 >= 4.1.0, PHP 5)

DOTNETLa clase DOTNET

$obj = new DOTNET("assembly", "classname")

Descripción

La clase DOTNET permite instanciar una clase desde un montaje .Net y llamar a sus métodos y acceder a sus propiedades.

Métodos

string DOTNET::DOTNET ( string $assembly_name , string $class_name [, int $codepage ] )

Constructor de la clase DOTNET. assembly_name especifica el montaje que debería ser cargado, y class_name especifica la clase que instanciar en ese montaje. Opcionalmente se puede especificar codepage para usarlo en transformaciones de cadenas a unicode; véase la clase COM para más detalles sobre páginas de código.

El objeto devuelto es un objeto sobrecargado, lo que significa que PHP no ve ningún método fijo como lo hace con las clases regulares; en su lugar, cualquier acceso a una propiedad o método es pasado a través de COM y de aquí a DOTNET. En otras palabras, el objeto .Net es mapeado a través de la capa de interoperabilidad de COM proporcionada por .Net runtime.

Una vez que se ha creado un objeto DOTNET, PHP lo trata de forma idéntica a cualquier otro objeto COM; se aplican las mismas reglas.

Example #1 Ejemplo de DOTNET

<?php
 $stack 
= new DOTNET("mscorlib""System.Collections.Stack");
 
$stack->Push(".Net");
 
$stack->Push("Hello ");
 echo 
$stack->Pop() . $stack->Pop();
?>

Note:

Necesita instanlar .Net runtime en su servidor web para tomar ventaja de esta característica.



VARIANT> <COM
Last updated: Fri, 20 May 2011
 
add a note add a note User Contributed Notes DOTNET
Anonymous 05-Jul-2010 12:17
As suggested before, you'll likely have to use a full assembly string including the assembly name, the assembly version (not the dll file version), the culture, and the public key token.  Otherwise, you'll get a 'file not found' catchable error.  To quickly find this on your own system to get the ball rolling, open C:\Windows\assembly in explorer (not in cmd as that shows a different view), scroll down the list until you find the assembly you want to work with, hover the mouse over it, and the tooltip shows the exact string to use (though processcorArchitecture if shown is optional).  You'll have to use .net utilities or other methods to automate collecting this info on other machines.

You'll also have to use the fully-qualified class name.  In other words, if you want to use the 'Form' class within 'System.Windows.Forms', you have to use the full class hierarchy 'System.Windows.Forms.Form'.  Otherwise you'll get an unhelpful 'Failed to instantiate .Net object' catchable error.

The following example shows the correct syntax to use the 'Form' class to pop up a blank form from php-cli, which can be used in leu of many Windows GUI PHP extensions out there.  Replace Version with your local version, and PublicKeyToken with your own local key token.

<?php

$full_assembly_string
= 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463';
$full_class_name = 'System.Windows.Forms.Form';
$form = new DOTNET($full_assembly_string, $full_class_name);

// code to add buttons, menus, text, etc

$form->Show();

$form_event = '';
while(
$form_event !== 'close') {

 
// handle form functions and events

 
}
?>
murat at muratyaman dot co dot uk 12-Feb-2010 01:46
First, I hit the same mine:

"... Failed to instantiate .Net object [Unwrapped, QI for IDispatch] [0x80004002] No such interface supported ..."

In order to load the assembly and class in it successfully, I had to change my AssemblyInfo.cs file regarding the visibility of the types in it.

// some code above

// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible(true)]

// some code below
m holmes at windowlogic dot com dot au 22-Sep-2009 04:31
For strongly-named NET assemblies that are registered in the GAC, you can just use the assembly name
e.g: $x = new DOTNET ("myAssembly", "myClass");

For strongly-named NET assemblies that aren't registered in the GAC, you need to use the full assembly string
e.g. $x = new DOTNET('myAssembly, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'myClass');

You can't instantiate assemblies that haven't been strongly named.

"Strongly named" means that the assembly has a public key. To strongly name your own classes in Visual Studio, go to the Signing tab in the project properties and click the 'sign the assembly' box and choose a key file name.

To register an assembly in the GAC, there are various tools around to do that, but the easiest method is to drag-and-drop the compiled assembly into c:\windows\assembly using windows explorer (a shell extension is installed by default that handles registering dragged files).
kschroeder at mirageworks dot com 08-Apr-2009 06:55
In order to find out what the PublicKeyToken value is, open up Explorer and go to c:\windows\assembly.  In that directory you will see all of the registered assemblies along with their PublicKeyToken value.
Kai Sellgren 26-Mar-2009 05:14
My HTTPD crashed everytime I used this feature. To fix it, I had to switch to CGI and now everything works fine.
G dot B dot Yahav at Gmail dot com 05-Mar-2009 08:30
Here is a simple example using .NET Framework in PHP

<?php
$console
= new DOTNET("mscorlib", "System.Console");
$varible = $console->ReadLine();
$console->WriteLine( "Varible: " . $varible );
$console->WriteLine();

unset(
$varible );
unset(
$console );
exit();
?>
sam at bitopia dot co dot uk 02-May-2008 03:54
If you want to load any other assembly apart from mscorlib, you'll need to include it like the following

$x = new DOTNET('The.Assembly.Name, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'The.Class.Name');

Replace all relevant details.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites