我有一个.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;
}
}
然后我回来了,
在How to correctly marshal VB-Script arrays to and from a COM component written in C# 的帮助下,Microsoft VBScript运行时(0x800A01C2)参数数量错误或 无效的属性赋值:'MyArray'
修改最终解决方案
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建议的那样,在使用之前将数组分配给变量。
再次感谢。
答案 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