c# - 如何正确地将对象按类型从 C# 传递到 VBScript?

标签 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;

    }
}

我在 Google 上搜索了很多网站,其中大多数建议将 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,而将 no 识别为我的类类型,但如果返回值包装为 object,则将类型重新识别为 ParseResult[ ]

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

谢谢!

最佳答案

你会为此自责,但你只需要使用 Set a = o.Parse(...) 而不是 a = o.Parse(.. .).

对于那些想知道为什么的人:a = o.Parse(...) 隐式地Let a = o.Parse(...)Let用于赋值,Set用于赋值对象。当使用 Let 分配一个对象时,它会将对象转换为一个值。我不记得该机制,但它可能使用标准 COM 技术,涉及类似 IDispatch 的内容。和 DISPID_VALUE 。调用此转换时,.NET 框架中的某些内容将返回对象的 ProgID 或完整的 .NET Namespace.ClassName。

关于c# - 如何正确地将对象按类型从 C# 传递到 VBScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50065255/

相关文章:

c++ - Axapta 商务连接器

c# - .NET,Equal() 只是 == 吗?

c# - 将 Ctrl+C 发送到上一个事件窗口

c# - 我想使用授权级别来保护 azure 功能

vbscript - 如何忽略VBScript中的Internet错误?

java - 为 swing 应用程序创建快捷方式的选项

Python win32 com : how to handle 'out' parameter?

c# - 我可以阻止 COM dll 显示表单吗?

c# - 如果没有打开文件的程序,则捕获文件的打开

vbscript - 如何在不同位置创建/修改快捷方式?