如何正确地将对象从C#传递到VBScript?

时间:2018-04-27 15:04:43

标签: c# vbscript com

如何将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

在这种情况下,系统会显示三条消息:ParseResultGSM.ParseResultOK

但是当我试图将我的功能改为

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

消息将是:StringGSM.ParseResult以及有关行Wscript.Echo a.Status的代码为800A01A8的异常消息。

为什么VBScript将返回对象的类型识别为String,而不是我的类类型,如果直接返回了对象,但是如果返回值被包装到ParseResult,则将类型重新调整为object[]

如何强制VBScript将返回对象的类型识别为ParseResult而不将其包装到object[]

谢谢!

1 个答案:

答案 0 :(得分:4)

你会为此而踢自己,但你只需要使用Set a = o.Parse(...)代替a = o.Parse(...)

对于那些想知道原因的人:a = o.Parse(...)隐含Let a = o.Parse(...)。分配值时使用Let,分配对象时使用Set。使用Let分配对象时,它会将对象转换为值。我不记得这种机制,但它可能使用涉及IDispatchDISPID_VALUE之类的标准COM技术。调用此转换时,.NET框架中的某些内容要么返回ProgID,要么返回对象的完整.NET Namespace.ClassName。