我正在 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/