【问题标题】:PHP5 COM(), DOTNET(): how to start?PHP5 COM()、DOTNET():如何开始?
【发布时间】:2011-03-11 12:11:03
【问题描述】:

我遇到的困难是使用 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]

  • COM 支持 => 已启用
  • DCOM 支持 => 禁用
  • .Net 支持 => 已启用

指令 => 局部值 => 主值

  • com.allow_dcom => 0 => 0
  • com.autoregister_casesensitive => 无价值 => 无价值
  • com.autoregister_typelib => 1 => 1
  • com.autoregister_verbose => 1 => 1
  • com.code_page => 无价值 => 无价值
  • com.typelib_file => 无价值 => 无价值

到目前为止,我只成功处理了三个案例。所有其他情况均失败,包括尝试使用其他 mscorlib 类...

我看到'System.Windows.Forms' 只是坐在 /windows/assembly 文件夹中嘲弄我。 $forms = new DOTNET('System.Windows.Forms', 'Form'); 失败,即使使用了完整的程序集字符串。我找错地方了吗?我是否应该从 .net 中处理此问题并创建自己的程序集以允许我从 PHP 动态调用其他人?

注意:使用 win32api PHP 扩展是正确的,因为它是一个死项目,我希望不再依赖其他人的宠物项目扩展。

编辑: COM 问题已基本解决。在注册表中,我能够找到 com 支持的软件和系统组件的列表,并使用它们的 clsid 创建几个 com 对象。不过仍然不确定如何创建 DOTNET 对象。

【问题讨论】:

    标签: .net windows com php


    【解决方案1】:

    PHP 手册指出 COM 和 DOTNET 是类而不是函数。

    你问如何使用这些类。每个手册页都包含构造函数参数的详细描述以及示例和大量相关的用户提供的文档。

    手册页没有提供您需要的内容吗?

    【讨论】:

    • 糟糕,已更正。不,手册页没有多大帮助。根据正确 dotnet() 语法的描述,$forms = new DOTNET('System.Windows.Forms', 'Form'); 应该可以工作,即使添加了完整的“版本”和“公共密钥令牌”程序集字符串。这让我很困惑。
    【解决方案2】:

    试试这个:

    $forms = new DOTNET('System.Windows.Forms', 'System.Windows.Forms.Form');
    

    我注意到手册中的示例使用完全限定的类名。

    【讨论】:

    • 不走运:“系统找不到指定的文件”
    • 您能否在服务器系统上创建和运行简单的 Windows 窗体应用程序?如有必要,安装Visual Studio Express 进行测试。下一个最可能的答案是 .NET 没有正确安装。
    • @John 刚刚安装了 vb express 2010 来尝试构建控制台测试应用程序。在 vb 中,我能够通过 .Net 引用 System.Windows.Forms 并使用该库中的类和方法来构建表单。测试应用程序编译、安装和执行成功。用PHP再次尝试,仍然没有运气。然后我重新安装了.Net。然后用PHP再次尝试,仍然没有运气。
    • @bob:我自己试了一下(在网络服务中),发现内部服务器错误。
    • @John 好的,虽然我刚刚开始工作,但我对导致问题的原因感到困惑。 $form = new DOTNET('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=<my_assembly_token>', 'System.Windows.Forms.Form'); 有效,$form->Show(); 弹出一个表单。我只能猜测我使用的原始程序集字符串有错字,我之前没有使用具有完全限定类名的完整程序集字符串,或者重新安装 .net 修复了问题。无论如何,现在我明白了,现在我走了。
    【解决方案3】:

    使用 COM 和 DOTNET 类是一场噩梦。 手册中没有出现很多警告。简而言之,您无法获得常规的 .Net 二进制文件并期望通过 PHP(没有 NetPHP)使用它。

    使用 COM,您可以实例化系统中的任何 COM 组件。

    使用 DOTNET,您只能针对已为 .NET 3.5 或更低版本编译的 .NET 程序集。

    类构造函数不能有参数,所有东西都需要修饰为 COM Visible。

    这基本上意味着您需要使您的自定义库适用于所有...无法使用。

    有一个非常方便的包装器,即 [PhpNet][1] 库,它使从 PHP 使用 .Net 变得轻而易举,并解决了所有这些问题:

    • 使用任何 .Net 二进制文件(即使没有 COM 可见性)
    • 直接从 PHP 迭代 .Net 集合
    • 访问本机枚举和静态方法
    • 使用带参数的类构造函数
    • 同时调试 .Net 和 PHP 代码,就像它是一个应用程序一样。
    • 使用为任何版本的 .Net 框架(包括 4.0 及更高版本)编译的库

    这就是我要说的:

    $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);
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2010-10-28
      • 1970-01-01
      • 2015-04-28
      • 2014-04-17
      • 2012-11-23
      • 2022-11-28
      • 2010-10-11
      • 2016-09-14
      相关资源
      最近更新 更多