exercise to try different type of method signature and calling them in php.
VB.net Code
Public Class Class1
Public Function SayHello(ByVal input As String) As String
Return "Php input: " & input & "</BR>Dot net library said- 'Hello'"
End Function
Public Function ConcatArray(ByVal Values As Object()) As String
Dim ret As String = String.Empty
For Each sval As Object In Values
ret = ret & sval.ToString & " "
Next
Return ret.Substring(1, ret.Length - 1)
End Function
Public Function ReturnObject(ByVal FirstName As String, ByVal LastName As String) As Name
Dim obj As New Name
obj.FirstName = FirstName
obj.LastName = LastName
Return obj
End Function
'To explain Byref doesn't work with php
Public Function CallByRef(ByRef value As String) As String
value = "Value to ByRef parameter set in dot net."
Return "ByRef CallByRef() method called."
End Function
End Class
Public Class Name
Public FirstName As String = String.Empty
Public LastName As String = String.Empty
End Class
Php code to test .net library
<?php
$class1 = new DOTNET("DotNetTest,"
."Version=1.0.0.0,"
."Culture=neutral,"
."PublicKeyToken=6675daefc27eafc4"
,"DotNetTest.Class1");
echo $class1->SayHello("Hi PHP!!!!");
echo "</P>";
$parameter[0] = 12345;
$parameter[1] = "MyString";
$parameter[2] = false;
$ret = $class1 -> ConcatArray($parameter);
echo $ret;
echo "</P>";
$Obj = $class1 -> ReturnObject("Sandip","Shimpi");
echo $Obj->FirstName." ".$Obj->LastName;
echo "</P>";
$myByRef = "";
echo "Value of ByRef Variable before calling .net CallByRef() method: ".$myByRef;
echo "</BR>";
echo $class1 -> CallByRef($myByRef);
echo "</BR>";
echo "Now value of ByRef Variable: ".$myByRef;
echo $myByRef;
?>
DOTNET
(PHP 4 >= 4.1.0, PHP 5)
DOTNET — DOTNET sınıfı
$obj = new DOTNET("kitaplik", "sinifAdi")
Tanım
DOTNET sınıfı, .Net kütüphanelerinden bir sınıf başlatmanıza, nesnenin özellik ve yöntemlerine erişmenize izin verir.
Yöntemler
DOTNET sınıf yapılandırıcısı. kutuphane_adi hangi kütüphanenin yükleneceğini, sinif_adi bu kütüphane içinde hangi sınıfın başlatılacağını belirler. Evrensel dizge dönüşümleri yapabilmek için seçimlik olarak kodsayfasi belirtebilirsiniz; kod sayfası hakkında daha fazla bilgi için COM sınıfına bakınız.
Geri dönen nesne aşırı yüklenmiş bir nesnedir, bunun anlamı PHP düzenli sınıflarda gördüğü herhangi bir durağan yöntemi göremeyecektir; bunun yerine herhangi bir özellik veya yönteme erişim COM vasıtası ile DOTNET'e gerçekleşecektir. Bir başka deyişle .Net nesneleri, .Net çalışma zamanı kütüphanesi tarafından sağlanan COM birlikte çalışılabilirlik katmanı ile eşleştirilecektir.
Bir DOTNET nesnesi oluşturduktan sonra, PHP ona herhangi bir COM nesnesine denk şekilde davranacaktır; yani aynı kurallar geçerlidir.
Örnek 1 DOTNET örneği
<?php
$stack = new DOTNET("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();
?>
Bilginize:
Bu özelliğin faydalarından yararlanmak için html sunucunuza .Net çalışma zamanı kütüphanesini kurmalısınız.
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
}
?>
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
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).
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.
My HTTPD crashed everytime I used this feature. To fix it, I had to switch to CGI and now everything works fine.
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();
?>
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.
