使用Classic ASP从COM对象检索字符串数组

时间:2011-10-11 17:06:13

标签: asp.net com asp-classic

我有一个.NET类,它通过一个访问器方法保存一个简单的字符串数组,看起来像这样;

namespace Foo.Bar {
    [ComVisible(true)]
    [Guid("642279A0-85D4-4c7a-AEF5-A9FAA4BE85E5")]
    public class MyClass {
        private string[] _myArray;
        public MyClass() { }

        public MyClass(string[] myArray) {
            _myArray = myArray;
        }

        public string[] MyArray {
            get { return _myArray; }
        }
    }
}

我使用经典ASP消费此类;

Dim foo 
Set foo = Server.CreateObject("Foo.Bar.MyClass")

if IsArray(foo.MyArray) then Response.Write("IsArray") & "<br />"
Response.Write(typename(foo.MyArray)) & "<br />"
Response.Write(UBound(foo.MyArray)) & "<br />"

这导致;

IsArray
String()
1

但是,当我尝试使用;

访问数组的内容时
Response.Write(foo.MyArray(0)) & "<br />"

我明白了;

  

Microsoft VBScript运行时(0x800A01C2)参数数量错误或   无效的属性赋值:'MyArray'

非常感谢任何帮助。

编辑这是为了在消化给出的答案后提供更多信息(谢谢)

将MyArray属性的实现更改为;

public object[] MyArray {
    get { return (object[])_myArray; }
}

然后我收到以下错误,

  

Microsoft VBScript运行时(0x800A000D)类型不匹配:'MyArray'

所以我尝试将每个字符串单独转换为一个对象;

public object[] MyArray {
    get {
        object[] tmp = new object[_myArray.Count()];
        for (int x = 0; x < _myArray.Count(); x++) {
            tmp[x] = (object)_myArray[x];
        }
        return tmp;
    }
}

然后我回来了,

  

Microsoft VBScript运行时(0x800A01C2)参数数量错误或   无效的属性赋值:'MyArray'

How to correctly marshal VB-Script arrays to and from a COM component written in C#

的帮助下,

修改最终解决方案

C#

public object MyArray {
    get { return _myArray.Cast<object>().ToArray(); }
}

的VBScript

Dim foo 
Set foo = Server.CreateObject("Foo.Bar.MyClass")

bar = foo.MyArray
Response.Write bar(0)

关键是要公开object而不是object[],正如AnthonyWJones建议的那样,在使用之前将数组分配给变量。

再次感谢。

3 个答案:

答案 0 :(得分:2)

问题是VBScript实际上不能使用String数组。它只能使用Variant的数组。

尝试更改MyClass以显示object[]

答案 1 :(得分:1)

除了Anthony的建议我不确定它是最好的方法,但过去我使用类似下面的代码来处理一维数组点。

public object MyArray(int ix = -1){
    string[] tmp = new string[] {"one", "two", "3", "4"};
    return (ix == -1) ? (object)tmp : tmp[ix];
}

在ASP中:

Response.Write(TypeName(foo.MyArray)) 'string()
Response.Write(TypeName(foo.MyArray(0))) 'string

答案 2 :(得分:-1)

此代码演示了如何在COM和ASP之间处理数组:

<% @Language="VBScript" %>
<% Option Explicit %>
<%
Dim tcs
Dim rc
Dim vntInput(0,4)
Dim i

vntInput(0,0) = Request.QueryString("strUser")
vntInput(0,1) = Request.QueryString("intCreate")
vntInput(0,2) = Request.QueryString("intDelete")
vntInput(0,3) = Request.QueryString("intModify")
vntInput(0,4) = Request.QueryString("intView") 

Set tcs = Server.CreateObject("TestCases.ArrayFailure")
rc = tcs.AcceptArray(vntInput)

For i = 0 to UBound(vntInput, 2)
    Response.write "Loop Count " & i & " " & vntInput(0,i) & "<BR>"
Next

%>

这是我找到此代码的文章的链接:
http://202.102.233.250/b2000/ASP/articles/component/pv990826.htm