能否将 string[] 编组为 safearray 变体?

Can on marshal a string[] to a safearray variant?

当我将我的函数 return 编组为 string[]UnmanagedType.StructSafeArraySubType = VarEnum.VT_ARRAY

namespace Whosebug
{
  [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
A VARIANT, which is used to marshal managed formatted classes and value types.

然而 VBScript 代码

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

报告 String()(这不是 Variant(),因此我将得到类型 稍后访问数组时出现不匹配错误。

当我将代码更改为

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

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

VBScript 代码似乎工作正常,但我想知道为什么我不能 return a string[] 并手动将其编组为包含 a 的变体 变体的安全数组。

看来SafeArraySubType没有效果。我的错误是什么?

那是因为 SafeArraySubType 仅适用于 SafeArray。

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