可以将字符串[]编组为safearray变体吗?

时间:2015-07-15 14:42:13

标签: c# vbscript com-interop

当我整理我的函数时,将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 Enumeration

  

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没有效果。我的错是什么?

1 个答案:

答案 0 :(得分:0)

这是因为SafeArraySubType仅适用于SafeArrays。

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