c# - 能否将 string[] 编码为 safearray 变体?

标签 c# vbscript com-interop

当我将返回 string[] 的函数编码为 UnmanagedType.Struct 时,使用 SafeArraySubType = 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
A VARIANT, which is used to marshal managed formatted classes and value types.

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

最佳答案

那是因为 SafeArraySubType 仅适用于 SafeArray。

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

关于c# - 能否将 string[] 编码为 safearray 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433552/

相关文章:

c# - 执行自定义查询—— Entity Framework

vbscript - 如何将以 “//”开头的参数传递给wsh脚本?

vb.net - 从 .net 调用的奇怪 COM 行为

c# - COM Interop 和 .NET 3.5 的问题 - 调试和 Release模式下的不同行为

com-interop - 如何使免注册 COM 在托管/非托管互操作中工作

c# - 序列化实体对象

c# - xsd2code - 反序列化 xml 文件时出现问题

c# - datagridView编辑

vbscript - 解析嵌入在 VBScript (QTP) 中的 XML

VBscript 用于确认文件列表存在且已在当天修改