如何将数组从c#dll返回到php

时间:2017-02-10 10:53:40

标签: c# php .net com

我有以下c#类库:

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

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或两者做些什么吗?

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

修改

正如Michael所说,我尝试了以下方法:

[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)相同

2 个答案:

答案 0 :(得分:1)

不是最好的方法,但看看你是否能够在Php中获得任何东西。

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

答案 1 :(得分:0)

你不能将数组保存在临时文本文档中,然后再读回来吗?

我想我会这样做。

MfG BTM3000