【问题标题】:Can on marshal a string[] to a safearray variant?可以将字符串 [] 编组为安全数组变体吗?
【发布时间】:2015-10-04 16:18:43
【问题描述】:

当我编组我的函数返回 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)

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

【问题讨论】:

    标签: c# vbscript com-interop


    【解决方案1】:

    那是因为 SafeArraySubType 仅适用于 SafeArrays。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2013-04-14
    • 2011-02-05
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多