【问题标题】:How to return an array from a c# dll to php如何将数组从 c# dll 返回到 php
【发布时间】:2017-06-28 16:41:57
【问题描述】:

我有以下 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 或两者都做些什么吗?

我还需要字符串数组,因此也欢迎任何帮助。

编辑:

按照迈克尔的建议,我尝试了以下方法:

[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) 一样

【问题讨论】:

  • 你试过UnmanagedType.LPArray吗?那是一个 c-style 数组...
  • 现在 - 做同样的事情

标签: c# php .net com


【解决方案1】:

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

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

【讨论】:

  • 不起作用,结果是Value at 0 is Value at 1 is Value at 2 is Value at 3 is
  • 不知道为什么它在其他方法不起作用的情况下有效,但它确实有效,所以谢谢
  • 我已经阅读了更多关于此的内容,似乎 PHP 数组实际上并不是数组,而是哈希表/链表。这就是为什么做起来并不简单。有关详细信息,请参阅nikic.github.io/2012/03/28/…。简而言之,需要付出很多努力来复制,我不会打扰 :-)
【解决方案2】:

您不能将数组保存在临时文本文档中,然后重新读回吗?

我想我会这样做的。

制造 BTM3000

【讨论】:

  • 是的,我也可以将整个结果作为字符串传回并在 php 中解析,但如果我能避免这种情况,我愿意。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多