Dot-Net

如何正確編組 VB 腳本數組進出用 C# 編寫的 COM 組件

  • February 5, 2020

我正在用 C# (.Net 4.0) 建構一個 COM 對象,以用於經典的 asp 站點。現在我想知道在組件和asp站點之間來回編組VB-Script數組(單維和多維)的正確方法是什麼?程式碼範例將不勝感激。

VBScript 只喜歡處理包含 VARIANTS 的 SAFEARRAY。牠喜歡在 COM 方法或屬性的 VARIANTS 中傳遞這些參數。因此,您需要構造一個包含 VARIANT 類型的 SAFEARRAY 的 VARIANT 屬性。以下 C# 程式碼執行此操作。首先只使用一個簡單的對像數組,然後還顯示我們可以將任何其他託管類型的數組轉換為對像數組,這樣編組程式碼將為我們將其轉換為 SAFEARRAY 的 VARIANT。

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(); } }
   }
}

這可以使用以下 vbscript 進行測試:

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 類型:Variant() 名稱:Variant()
0
1
1
2
3
5
8
13
21
34
一
二
三
四
五

引用自:https://stackoverflow.com/questions/5079200