Вопрос по php, .net, iis-7 – Проблемы с использованием DOTNET из PHP.

4

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

<?php
echo "hello1";
try{
$csclass = new DOTNET("ModelBuilder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1208136d23b48dc5",
                      "ModelBuilder.ModelBuilder2");

$class_methods = get_class_methods($csclass);

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
echo "hello2";
?>

Error: User Rate Limit Exceeded

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using OfficeOpenXml;
using System.Runtime.InteropServices;

namespace ModelBuilder
{    
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class ModelBuilder2
    {
        [ComVisible(true)]
        public Boolean BuildModel(String outputFileLoc,String excelTemplateFile)
        {
            try
            {
                //do stuff
            return true;
        }
        catch (Exception e)
        {                
            return false;
        }
    }

} 
Ты пыталсяvar_dumpИНГ$classmethods? Cole Johnson
var_dump () создает array (0) {} ... поэтому методы почему-то невидимы. Любая идея? user1167650

Ваш Ответ

1   ответ
8

get_class_methods() не будет работать с объектом класса Dotnet. Эта вещь - прокси, и она не ведет себя так, как обычный объект php.

Если вы действительно сосредоточены на перечислении методов объекта, то вам нужно изучить реализацию IDispatch для вашего объекта .NET. Если, однако, ваша главная цель состоит в том, чтобы простоuse объект .NET, и ваша попытка перечислить методы была лишь побочной попыткой выяснить, почемуthat не работал, то у меня есть несколько предложений для вас.

rather than using gacutil, consider whether you can insert the required DLL into the php directory, the place where php.exe resides. If php.exe resides at c:\php5\php.exe, then copy your assembly into c:\php5.

If you follow the above suggestion, the .NET assembly need not be strongly named. It needs to be strongly named if you plan to GAC it. As I said, you don't need to GAC it, in order to load it with php. If you copy the assembly into the PHP dir, then you can use an un-signed assembly.

For early development and exploration with this, use the php.exe program from the command-line, rather than using IIS to launch php via a web request. This lets you see the error messages directly, rather than worrying about 500 errors from IIS.

Example

Предположим, что это код C #:

using System;
namespace Ionic
{
    public class MathEx
    {
        System.Random rnd;
        public MathEx ()
        {
            rnd = new System.Random();
        }

        public int RandomEven()
        {
            return rnd.Next()*2;
        }
    }
}

Скомпилируйте его из командной строки следующим образом:

c:\net3.5\csc.exe /t:library /out:Ionic.MathEx.dll MathEx.cs

скопируйте сборку в каталог, содержащий php.exe:

copy Ionic.MathEx.dll \php
        1 file(s) copied.

Затем, предположим, у меня есть php-скрипт с именем mathex.php с таким содержимым:

<?php
$my_assembly = 'Ionic.MathEx'; // name of the dll without the .dll suffix
$clz = new DOTNET($my_assembly, 'Ionic.MathEx');
for ($i=0; $i<5; $i++) {
    echo $i . " " . $clz->RandomEven() . "\n";
}
?>

... и если я запускаю его из командной строки следующим образом:

\php\php.exe  mathex.php  

... тогда я получаю эти результаты:

0 -1083602762
1 1535669896
2 -86761710
3 -1204365564
4 459406052

Nota Bene

Я попытался сделать это с помощью сборки, скомпилированной с помощью .NET 4.0, но она не сработала, выдав мне сообщение об ошибке несоответствия времени выполнения .NET. Как это:

Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object
[CreateInstance] [0x8013101b] ' in C:\dev\php\mathEx.php:6
Stack trace:
#0 C:\dev\php\mathEx.php(6): dotnet->dotnet('Ionic.MathEx', 'Ionic.MathEx')
#1 {main}
  thrown in C:\dev\php\mathEx.php on line 6

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

Из этого я заключаю, что php5 скомпилирован для поддержки .NET 2.0 (который включает в себя 3.0 и 3.5). Версия среды выполнения изменилась для .NET 4.0, поэтому сборки, которые вы компилируете с помощью компилятора .NET 4.0 (включая VS2010), не будут использоваться с php5.exe. Обходной путь - просто скомпилировать с помощью компилятора .NET 2.0 или 3.5 (VS2005, vs2008).

Похоже, что причиной проблемы было использование DLL, созданной по умолчанию & quot; Debug & quot; Конфигурация в сравнении со стандартной версией "Выпуск" Конфигурация в визуальной студии. PHP не должен нравиться флаг отладки или что-то. user1167650
(добавление к комментарию выше): когда я вызываю example.php, он прекращает генерировать HTML-код в строке функции DOTNET (), но не выдает никакой ошибки. Не уверен, что не так. user1167650
Хм, ну, это звучит так, как будто ты все решил. Я сомневаюсь, что это была просто отладочная конфигурация сборки, которая вызвала проблему. Я только что попробовал с/debug+ и это работало нормально для меня. Этоmay быть платформой (MSIL против x86). Использование версии 4.0 (vs 2.0) определенно вызывает проблемы. Использование неправильной целевой платформы также может вызвать проблемы. Во всяком случае, рад, что вы разобрались.
Вы использовали код, который я предоставил? скомпилировать именно так, как я предложил? Я думаю, что вам нужно упростить. Просто получите что-то основное, работающее. Докажите себе, что это работает. Тогда добавь сложность.
Может быть, я что-то упустил, но это не работает. У меня есть DLL в моей папке php и вызываю php.exe example.php. Кажется, он не использует DLL (нет ошибки, но если я изменяю имя DLL, ошибка не выдается, а когда я вызываю функцию той библиотеки DLL, которая существует или не существует, ошибки нет). (1) Есть ли что-то еще, что мне нужно сделать? (2) есть ли ограничения на тип вещей, которые может делать DLL? (помимо того, какую версию .net использовать) user1167650

Похожие вопросы