У меня есть следующие библиотеки классов 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)
Вы пробовали 'UnmanagedType.LPArray'? Это массив * c-style * ... –
Имеет сейчас - делает то же самое – Graham