不能将字符串[]封送为数组变体

本文关键字:数组 字符串 不能 | 更新日期: 2023-09-27 18:03:02

当我编组函数返回string[]作为UnmanagedType.StructSafeArraySubType = VarEnum.VT_ARRAY时,如

namespace StackOverflow
{
  [ComVisible(true)]
  [Guid("4BDC43D4-8FD7-4F58-BEE5-E57C3C144C1B")]
  public class Array
  {
    [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
    public string[] StringArray()
    {
      return new string[] { "foo", "bar" };
    }
  }
}

我期望得到一个变体(UnmanagedType)枚举)

Struct
一个VARIANT,用于封送托管的格式化类和值类型。

但是VBScript代码

WScript.Echo TypeName(CreateObject("StackOverflow.Array").StringArray)

报告String()(它不是Variant(),因此我将获得类型

当我将代码更改为

public object[] ObjectArray()
{
  return new object[] { "foo", "bar" };
}
public object PlainObject()
{
  return new object[] { "foo", "bar" };
}

VBScript代码似乎工作得很好,但我想知道为什么我不能返回string[]并手动将其编组为包含a的变体

看来SafeArraySubType没有效果。我错在哪里?

不能将字符串[]封送为数组变体

这是因为SafeArraySubType只适用于safearray。

MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]