我当前的雇主有一些旧的/旧的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调试并逐步执行代码,快速手表显示了此{...},所以我认为它返回了一些内容,但是我不确定这是什么内容。
答案 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();
}