Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确地将对象按类型从C#传递到VBScript?_C#_Vbscript_Com - Fatal编程技术网

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

如何正确地将对象按类型从C#传递到VBScript?,c#,vbscript,com,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;

如何将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#return value传递。在这种情况下,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
在这种情况下,将显示三条消息:
ParseResult
GSM.ParseResult
OK

但是当我尝试将函数改为

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
消息将是:
String
GSM.ParseResult
和关于代码800A01A8异常的消息,用于行
Wscript.Echo a.Status

若直接返回对象,为什么VBScript将返回对象的类型识别为字符串,将no识别为我的类类型,而若返回值被包装为
对象[]
,则将类型重新识别为
ParseResult

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


谢谢大家!

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


对于那些想知道为什么的人:
a=o.Parse(…)
是隐式的
Let a=o.Parse(…)
<分配值时使用“代码>让”,分配对象时使用“设置”。当使用
Let
分配对象时,它会将对象转换为值。我不记得机制,但它可能使用标准的COM技术,包括和。调用此转换时,.NET framework中的某些内容会返回对象的ProgID或完整的.NET Namespace.ClassName。

为什么不为类使用
ClassInterfaceType.AutoDual
ClassInterfaceType.AutoDispatch
?如果
设置a=o.Parse(…)
而不是
a=o.Parse(…)
?我已经尝试了这两种方法,但是这些改变并没有解决问题……迈克尔·冈特,你是我的时间节省者!非常感谢你!你能回答这个问题吗?如果没有设置,它将尝试使用对象的默认值而不是对象引用。没有,卡布姆。语法歧义在vb.net中已修复,默认属性必须始终是索引属性。