.net - 如何正确地将 VB-Script 数组编码到用 C# 编写的 COM 组件或从中编码

标签 .net arrays asp-classic marshalling com-interop

我正在 C# (.Net 4.0) 中构建一个 COM 对象,以便在经典的 asp 站点中使用。现在我想知道在组件和 asp 站点之间来回编码 VB-Script 数组(单维和多维)的正确方法是什么?代码示例将不胜感激。

最佳答案

VBScript 只喜欢处理包含 VARIANTS 的 SAFEARRAY。它喜欢将这些传递到 COM 方法或属性的 VARIANTS 中。因此,您需要构造一个包含 VARIANT 类型的 SAFEARRAY 的 VARIANT 属性。以下 C# 代码执行此操作。首先仅使用一个普通的对象数组,然后还表明我们可以将任何其他托管类型的数组转换为对象数组,以便编码代码将其转换为我们的 VARIANT 的 SAFEARRAY。

using System;
using System.Runtime.InteropServices;
using System.Linq;

namespace StackOverflow
{
    [ComVisible(true)]
    [Guid("2F4C19A6-9BB9-4ACF-90D1-BAF48696740A")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IMyArrayDemo
    {
        [DispId(1)]
        int Count
        {
            [return: MarshalAs(UnmanagedType.I4)]
            get;
        }
        [DispId(2)]
        object Data
        {
            [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
            get;
        }
        [DispId(3)]
        object Names
        {
            [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
            get;
        }
    }

    [ComVisible(true)]
    [Guid("7EF75834-22BE-4861-879B-EA0CE20E46E9")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("StackOverflow.MyArrayDemo")]
    public class MyArrayDemo : IMyArrayDemo
    {
        object[] mData = new object[10] { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
        string[] mNames = new string[5] {"one", "two", "three", "four", "five"};
        public int Count { get { return mData.Length; } }
        public object Data { get { return mData; } }
        public object Names { get { return mNames.Cast<object>().ToArray(); } }
    }
}

这可以使用以下 vb 脚本进行测试:

Option Explicit
Sub Main
  Dim o, v
  Set o = CreateObject("StackOverflow.MyArrayDemo")
  WScript.Echo "Count " & o.Count & " type: " & TypeName(o.Data) & " names: " & TypeName(o.Names)
  For Each v in o.Data : WScript.Echo CStr(v) : Next
  For Each v in o.Names : WScript.Echo v : Next
End Sub
Main

您可以看到此处报告的类型为 Variant() - 即:变体数组。

C:\Users\pat>\windows\SysWOW64\cscript.exe -nologo arraytest.vbs
Count 10 type: Variant() names: Variant()
0
1
1
2
3
5
8
13
21
34
one
two
three
four
five

关于.net - 如何正确地将 VB-Script 数组编码到用 C# 编写的 COM 组件或从中编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079200/

相关文章:

c# - 当 IsReadOnly 是接口(interface)成员时,List<T> 如何使 IsReadOnly 私有(private)?

c# - 在图像控件中显示位图

c# - 由于程序集名称而导致 MEF 组合错误?

javascript - 如何在 JavaScript 中调用/运行 Postman API

asp.net - 经典asp和ASP.NET之间的密码加密/解密

c# - 在 ASP.Net Web API Controller 中如何找到用户名?

javascript - 如何显示预加载在二维数组中而不是占位符的图像切片?

java - Java int[] 压缩工具

c - 理解 char *、char[] 和 strcpy()

java - 经典 ASP 和 Java 小程序