Dot-Net
如何正確編組 VB 腳本數組進出用 C# 編寫的 COM 組件
我正在用 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 一 二 三 四 五