2017-02-10 12 views
0

У меня есть следующие библиотеки классов C#:Как вернуть массив из C# DLL для PHP

using System.Runtime.InteropServices; 

namespace phptest 
{ 
    public class Class1 
    { 
     public int getint() 
     { 
      return 17; 
     } 

     public string getstring() 
     { 
      return "yup"; 
     } 

     public int doubleint(int x) 
     { 
      return x * 2; 
     } 

     public string doublestring(string s) 
     { 
      return s + s; 
     } 

     [return: MarshalAs(UnmanagedType.SafeArray)] 
     public int[] getintarray() 
     { 
      return new int[] { 1, 7, 9 }; 
     } 
    } 
} 

и следующий скрипт, чтобы проверить это:

$obj = new COM("phptest.Class1"); 
print $obj->getint(); 
print "\r\n" . $obj->getstring(); 
print "\r\n" . $obj->doublestring("dog") . "\r\n"; 
print $obj->doubleint(11); 
$x = $obj->getintarray(); 
print_r($x); 

Это все работает за исключением getintarray();

последняя строка из выходов PHP скрипт: variant Object

var_dump($x) появляется пустым.

если изменить C#, чтобы вернуть массив объектов вместо:

[return: MarshalAs(UnmanagedType.SafeArray)] 
public object[] getintarray() 
{ 
    return new object[] { 1, 7, 9 }; 
} 

затем var_dump($x) придумывает:

object(variant)#2 (0) { 
} 

Как добраться до значений в массиве, переданных обратно C# dll?

Есть ли что-то, что мне нужно сделать для C# или php или обоих?

Мне также понадобятся строковые массивы, поэтому любая помощь в этом будет очень желанной.

EDIT:

Как полагает Майкл, я попытался следующие:

[return: MarshalAs(UnmanagedType.LPArray)] 
public int[] getintarray() 
... 

Он имеет те же возвращается, как, когда я был его возвращающий массив объектов.

Также count($x) дает мне количество элементов в возвращаемом массиве (3 в данном случае)

Я попытался доступ к элементам следующим образом:

$x[0]   outputs "variant Object" 
$x->value  outputs nothing 
$x[0]->value outputs nothing 
$x->0   outputs nothing 

var_dump ($ х [0 ]) дает мне то же самое, что и var_dump ($ x)

+0

Вы пробовали 'UnmanagedType.LPArray'? Это массив * c-style * ... –

+0

Имеет сейчас - делает то же самое – Graham

ответ

1

Не лучший способ сделать это, но посмотреть, можете ли вы получить что-либо с этим в Php.

foreach($x as $array){ 
    echo "Value ".$array. "<br/>"; 
} 
+0

Не работает, результат равен «Значение в 0» Значение в 1 является значением в 2 является значением в 3 is' – Graham

+1

не знаю почему это работает там, где другие методы этого не делают, но это так, так что спасибо – Graham

+0

Я читал еще об этом, и кажется, что массивы PHP на самом деле не массивы, но они хэш-таблицы/связанные списки. Вот почему это не просто сделать. Подробнее см. Https://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html.Короче говоря, много усилий для репликации, и я не собираюсь беспокоиться :-) – Graham

0

Не могли бы вы просто сохранить массив во временном текстовом документе, а затем снова прочитать его снова?

Я думаю, что сделал бы это.

MfG BTM3000

+0

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