从.Net COM类

时间:2019-06-15 20:59:00

标签: c# vbscript com-interop

我当前的雇主有一些旧的/旧的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 :(得分:-1)

我绝不是专家,但这在我的一个项目中为我工作了

// .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();
}