PHP5 COM (), DOTNET (): как начать? - PullRequest
1 голос
/ 04 июля 2010

Где я застрял - это правильный синтаксис параметров для создания экземпляра объекта с использованием классов PHP com() и dotnet() для загрузки сборок .net, системных приложений Windows и компонентов, выходящих за рамки обычных приложений MS Office. При успешном создании работа с объектами здесь не проблема.

Может кто-нибудь объяснить, что означает каждая часть каждого параметра для обоих классов, и как я могу узнать правильный синтаксис вызова для любого приложения, компонента или сборки? Что именно может или не может загрузить PHP, и если может, то как? Как мне узнать, какие системные компоненты и классы видимы и могут быть доступны через com () и dotnet ()? При вызове сборок я не прав, если предположить, что здесь можно использовать что-либо из перечисленного в папках / windows / assembly / gacxx?

Я пытаюсь углубиться в подключение или использование системных приложений, компонентов и сборок Windows. Например, используя сборку System.Windows.Forms. После просмотра руководства PHP по теме , включая примеры кода, для меня ничего не понятно. Из-за ошибок PHP я не могу правильно понять синтаксис, не могу найти указанные файлы, или просто не получаю объяснения. Связанные события не отображаются в средстве просмотра событий, которые бы указывали на сбой приложения или отказ в доступе.

У меня установлен .net 4 framework. Это мои текущие настройки PHP ...

скомпилировано: --enable-com-dotnet

[com_dotnet]

  • Поддержка COM => включена
  • Поддержка DCOM => отключена
  • .Net support => включено

Директива => Локальное значение => Основное значение

  • 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 ...

<?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?

Примечание: вместо этого используется PHP-расширение win32api, так как это мертвый проект, и я надеюсь отойти от зависимости от расширений других любимых проектов.

Редактировать: Проблема с COM в основном решена. В реестре я смог найти список поддерживаемых com-компонентов программного обеспечения и системы и создать несколько com-объектов, используя их clsid. Тем не менее, пока точно не знаете, как создавать объекты DOTNET.

Ответы [ 3 ]

1 голос
/ 04 июля 2010

Попробуйте это:

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

Я заметил, что в примерах из руководства используются полные имена классов.

0 голосов
/ 04 июня 2015

Использование классов COM и DOTNET - это кошмар. столько предостережений, которые не указаны в руководствах . Проще говоря, вы не можете получить обычный двоичный файл .Net и ожидать его использования из PHP (без NetPHP).

Используя COM, вы можете создать экземпляр любого компонента COM в системе.

Используя DOTNET, вы можете ориентироваться только на сборки .NET, скомпилированные для .NET 3.5 или ниже.

У конструкторов классов не может быть параметров, и все должно быть оформлено как COM Visible.

Это в основном означает, что вам нужно сделать свои собственные библиотеки для всего ... непригодного для использования.

Существует очень удобная оболочка, библиотека [PhpNet] [1], которая позволяет легко использовать .Net из PHP и решает все эти проблемы:

  • Использовать любые двоичные файлы .Net (даже без видимости COM)
  • Перебирать коллекции .Net напрямую из PHP
  • Доступ к собственным перечислениям и статическим методам
  • Использовать конструкторы классов с параметрами
  • Отладка .Net и PHP-кода одновременно, как если бы это было одно приложение.
  • Работа с библиотеками, скомпилированными для любой версии .Net framework (включая 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);
0 голосов
/ 04 июля 2010

В руководстве по PHP указано, что COM и DOTNET являются классами, а не функциями.

Вы спрашиваете, как использовать эти классы.Страница руководства для каждого из них содержит подробные описания аргументов конструктора, а также примеры и достаточное количество соответствующей документации, предоставленной пользователем.

Разве страницы руководства не предоставляют то, что вам нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...