Как правильно передать объект по типу из C # в VBScript? - PullRequest
0 голосов
/ 27 апреля 2018

Как передать объект C # в VBScript?

Мой класс C #, который я хочу вернуть:

namespace GSM
{

    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E125E")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("GSM.ParseResult")]
    public class ParseResult
    {
        public string Status;
        public HtmlNode table;

    }
}

Я погуглил много сайтов, и большинство из них рекомендует передавать object[] в качестве возвращаемого значения C #. В этом случае VBScript выполняет итерации и корректирует типы и значения объектов. Например, функция, которая возвращает его, выглядит примерно так:

public object[] Parse(string userid, string password, string startDate, string endDate)
        {
            ParseResult parseResult = new ParseResult();
            parseResult.Status="OK";   

            object o = (object)parseResult;
            object[] oa = new object[] { o };
            return oa;     
        }

и VBScript, что хорошо с ним работает:

Dim o
Set o = CreateObject("1C_GSM.TestComClass")
Dim a
a = o.Parse("51597", "********", "01-03-2017", "31-03-2017")
For Each entry In a
                Wscript.Echo TypeName(entry)
                Wscript.Echo entry
                Wscript.Echo entry.Status
Next

В этом случае будут показаны три сообщения: ParseResult, GSM.ParseResult и OK.

Но когда я пытаюсь изменить свою функцию на

public ParseResult Parse(string userid, string password, string startDate, string endDate)
            {
                ParseResult parseResult = new ParseResult();
                parseResult.Status="OK"; 

                return parseResult;     
            }

и пытается вызвать его в VBScript с кодом

Dim o
Set o = CreateObject("1C_GSM.TestComClass")
Dim a
a = o.Parse("51597", "********", "01-03-2017", "31-03-2017")
Wscript.Echo TypeName(a)
Wscript.Echo a
Wscript.Echo a.Status

сообщения будут: String, GSM.ParseResult и сообщение об исключении с кодом 800A01A8 для строки Wscript.Echo a.Status.

Почему VBScript распознает тип возвращаемого объекта как String, а не как мой тип класса, если объект был возвращен напрямую, но преобразует тип как ParseResult, если возвращаемое значение было перенесено в object[]?

Как заставить VBScript распознавать тип возвращаемого объекта как ParseResult, не заключая его в object[]?

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Вы собираетесь себя за это пнуть, но вам просто нужно использовать Set a = o.Parse(...) вместо a = o.Parse(...).

Для тех, кому интересно, почему: a = o.Parse(...) неявно Let a = o.Parse(...). Let используется при назначении значений, а Set используется при назначении объектов. При использовании Let для назначения объекта он будет преобразовывать объект в значение. Я не помню этот механизм, но он, вероятно, использует стандартные методы COM, включающие такие вещи, как IDispatch и DISPID_VALUE. Когда это преобразование вызывается, что-то в .NET Framework возвращает либо ProgID, либо полное .NET Namespace.ClassName вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...