2017-02-10 25 views
0

我有以下的C#类库:如何返回从AC#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 }; 
     } 
    } 
} 

和下面的PHP脚本来测试它:

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

除了它所有的作品PHP脚本输出的getintarray();

最后一行:variant Object

var_dump($x)出现空白。

,如果我改变C#返回对象的数组来代替:

object(variant)#2 (0) { 
} 

我如何在通过传回的数组中的值:

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

然后var_dump($x)有出现C#的DLL?

有什么我需要做的C#或PHP或两者?

我还需要字符串数组,所以对此的任何帮助都会受到欢迎。

编辑:

如所建议的通过迈克尔,我尝试以下:

[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($ X [0 ])给了我一样的var_dump($ x)

+0

您试过'UnmanagedType.LPArray'吗?这是一个* c风格*数组... –

+0

现在 - 做同样的事情 – Graham

回答

1

不是最好的方式来做到这一点,但看看你是否能够得到任何与此在Php。

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

不起作用,结果是'在0的值是在1的值是在2的值是在3的值是' – 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