Получить массив строк из COM-объекта с помощью Classic ASP - PullRequest
3 голосов
/ 11 октября 2011

У меня есть класс .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; }
        }
    }
}

Я использую этот класс с использованием Classic 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 runtime (0x800A01C2) Неверное количество аргументов или неверное присвоение свойства: 'MyArray'

Любая помощь очень ценится.

Редактировать Это предоставить дополнительную информацию после переваривания полученных ответов (спасибо)

При изменении реализации свойства MyArray на;

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

Я тогда получаю следующую ошибку,

Microsoft VBScript runtime (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 runtime (0x800A01C2) Неверное количество аргументов или недопустимое присвоение свойства: 'MyArray'

Редактировать Окончательное решение с помощью Как правильно упорядочить массивы VB-Script в и из COM-компонента, написанного на 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 ]

2 голосов
/ 11 октября 2011

Проблема в том, что VBScript не может использовать массив String.Он может использовать только массив Variant.

Попробуйте изменить MyClass, чтобы вместо него выставить object[].

1 голос
/ 12 октября 2011

В дополнение к предложению Энтони Я не уверен, что это лучший способ, но в прошлом я использовал код, подобный следующему, для обработки одномерных массивов.

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
0 голосов
/ 11 октября 2011

Этот код демонстрирует, как обрабатывать массивы между 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

...