Получить список строк в VBScript из .Net COM класса - PullRequest
0 голосов
/ 15 июня 2019

У моего нынешнего работодателя есть некоторые старые / устаревшие подпрограммы VBScript, которые вызывают некоторые старые / старые программы .Net, и я пытаюсь понять, как они работают. Трудно найти хорошие учебники, поэтому я создал простую программу .Net с парой функций и кодом VBS для их вызова. Для примитивных возвращаемых типов все работает как положено, но у меня проблемы со сложными объектами.

Интерфейс C #:

using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    [ComVisible(true)]
    [Guid("67F6AA4C-A9A5-4682-98F9-15BDF2246A74")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IClass1
    {
        string Hello();
        List<string> HelloList();
    }
}

Класс бетона C #:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("D24536F5-ECD9-482B-8C57-C9EC2195546D")]
    public class Class1 : IClass1
    {
        public string Hello()
        {
            return "Hello world, how are you?";
        }
        public List<string> HelloList()
        {
            List<string> rtn_list = new List<string>();
            rtn_list.Add("String1");
            rtn_list.Add("String2");
            rtn_list.Add("String3");
            rtn_list.Add("String4");
            return rtn_list;
        }
    }
}

И мой VB скрипт:

' --------------------------------------------------------------
' Testing for calling .Net Framework from vbs
' --------------------------------------------------------------
Call CheckArguments
Call GetHelloTest1
Call GetHelloTest2

' --------------------------------------------------------------
' Sub  : GetHelloTest2
' Desc : Create the COM object and call a function that 
'        returns an array of strings
' --------------------------------------------------------------
Sub GetHelloTest2
    Dim objObject
    Set objObject = WScript.CreateObject("ClassLibrary1.Class1")
    Dim objOutput
    Set objOutput = objObject.HelloList

    ' ?? Not sure how to iterate over the list ?? 
    'WScript.Echo objObject.Hello

End Sub


' --------------------------------------------------------------
' Sub  : GetHelloTest1
' Desc : Create the COM object and call a simple function
' --------------------------------------------------------------
Sub GetHelloTest1
    Dim objObject
    Set objObject = WScript.CreateObject("ClassLibrary1.Class1")
    Dim objOutput
    objOutput = objObject.Hello
    WScript.Echo objOutput
End Sub


' --------------------------------------------------------------
' Sub  : CheckArguments
' Desc : Verify the arguments and create a dictionary object
' --------------------------------------------------------------
Sub CheckArguments
    text = "Arguments" & vbCrLf & vbCrLf
    Set objArgs = WScript.Arguments       ' Create object.
    For i = 0 to objArgs.Count - 1        ' Loop through all arguments.
        text = text & objArgs(i) & vbCrLf ' Get argument.
    Next 
    WScript.Echo text ' Show arguments using Echo.
End Sub

Все отлично работает, кроме вызова HelloList, который выглядит так, как будто он что-то возвращает, но я не могу понять, как перебирать список в коде VBS? Ошибка не возвращается, и я могу использовать VS2017 для отладки и пошагового выполнения кода, быстрое наблюдение показывает это {...}, поэтому я думаю, что оно что-то вернуло, но я не уверен, что это такое?

1 Ответ

0 голосов
/ 17 июня 2019

Я ни в коем случае не эксперт, но это сработало для меня в одном из моих проектов

// .COM
[ComVisible(true)]
public object GetSomeStringsForCom()
{
    return GetSomeStrings.Cast<object>().ToArray();
}

// .Net
ComVisible(false)]
public IEnumerable<string> GetSomeStrings()
{
    IList<string> retval = new List<string>();
    retval.Add("hello 1");
    retval.Add("hello 2");
    retval.Add("hello 3");
    return retval.ToArray();
}
...