我遇到的是使用PHP的com()
和dotnet()
类来实例化对象的正确参数语法,以加载.net程序集,Windows系统应用程序和组件,而不是通常的MS Office应用程序。如果成功创建,则使用对象不是问题。
任何人都可以解释每个参数的每个部分对于这两个类的含义,以及如何找到适用于任何应用程序,组件或程序集的正确调用语法?什么可以或不能PHP加载,如果可以,如何?我如何找出哪些系统组件和类是可见的并且可以通过com()和dotnet()获得?对于调用程序集,我错误地假设/ windows / assembly / gacxx文件夹中列出的任何内容都可以在这里使用?
我正在尝试深入研究连接或使用Windows系统应用程序,组件和程序集。例如,使用'System.Windows.Forms'程序集。在审核了包含代码示例的PHP's manual on the topic后,对我来说并没有更清楚。由于PHP的错误,我无法正确使用语法,无法找到指定的文件,或者只是在没有解释的情况下完全失败。事件查看器中没有相关事件显示提示应用程序崩溃或拒绝访问。
我安装了.net 4框架。这些是我目前的PHP设置......
编译: - enable-com-dotnet
[com_dotnet]
指令=>本地值=>主值
到目前为止,我已经成功完成了三起案件。所有其他情况都失败,包括尝试使用其他mscorlib类......
<?php $scripting = new COM("MSScriptControl.ScriptControl"); $scriping_host = new COM("WScript.Shell'); $stack = new DOTNET("mscorlib", "System.Collections.Stack"); ?>
我看到'System.Windows.Forms'只是坐在/ windows / assembly文件夹中嘲弄我。 $forms = new DOTNET('System.Windows.Forms', 'Form');
失败,即使使用完整的汇编字符串也是如此。我在找错了地方吗?我是否应该从.net内部处理此问题并创建自己的程序集以允许我从PHP动态调用其他人?
注意:使用win32api PHP扩展程序是正确的,因为它是一个死的项目,我希望不再依赖于其他人的宠物项目扩展。
编辑: COM问题主要解决了。在注册表中,我能够找到com支持的软件和系统组件的列表,并使用它们的clsid创建几个com对象。仍然不确定如何创建DOTNET对象。
答案 0 :(得分:1)
试试这个:
$forms = new DOTNET('System.Windows.Forms', 'System.Windows.Forms.Form');
我注意到手册中的示例使用了完全限定的类名。
答案 1 :(得分:0)
使用COM和DOTNET类是一场噩梦。 有很多警告未出现在手册中。简单地说,你不能得到一个普通的.Net二进制文件,并希望从PHP中使用它(没有NetPHP)。
使用COM可以实例化系统中的任何COM组件。
使用DOTNET,您只能定位为.NET 3.5或更低版本编译的.NET程序集。
类构造函数不能包含参数,并且所有内容都需要修饰为COM Visible。
这基本上意味着您需要为所有内容创建自定义库...无法使用。
有一个方便的包装器,[PhpNet] [1]库,可以轻松地从PHP中使用.Net并解决所有这些问题:
这就是我所说的:
$manager = new \NetPhp\Core\NetManager();
$manager->RegisterAssembly('mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'mscorlib');
$manager->RegisterClass('mscorlib', 'System.IO.File', 'File');
$manager->RegisterClass('mscorlib', 'System.IO.FileOptions', 'FileOptions');
$file = $manager->Create('mscorlib', 'File');
$fileoptions = $manager->Create('mscorlib', 'System.IO.FileOptions')->Enum('Encrypted');
$file->Create("C:\\www\\prueba.tres", 2048, $fileoptions);
答案 2 :(得分:-1)