能否将string[]转换为safearray variant?

3
当我使用SafeArraySubType = VarEnum.VT_ARRAY将返回string[]的函数编排为UnmanagedType.Struct时,如下所示:
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 枚举)。

结构体
一个 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 []并手动将其封送到包含变量安全数组的变量中。
看起来SafeArraySubType没有效果。我的错误在哪里?
1个回答

2
那是因为SafeArraySubType仅适用于SafeArrays。
MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]

我认为这很不可能,因为https://dev59.com/zW445IYBdhLWcg3wBVvz使用了`UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY`。 - Micha Wiedenmann
这是因为对于结构体,SafeArraySubType被忽略了。由于结构体的本质已经是一个“变量数组”(https://msdn.microsoft.com/en-us/library/vstudio/system.runtime.interopservices.unmanagedtype(v=vs.100).aspx),因为它们的属性按顺序排列。 - Alexandre Borela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接