如何正确地将对象按类型从 C# 传递到 VBScript?
How to correctly pass object by type from C# to VBScript?
如何将 C# 对象传递给 VBScript?
我的 C# class,我想要 return 是:
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# return 值传递。在这种情况下,VBScript 可以很好地迭代和重新调整对象类型和值。例如函数,returns 是这样的:
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 将 returned 对象的类型识别为字符串,而不是我的 class 类型,如果对象是直接 returned,但将类型识别为 ParseResult
,如果 returned 值被包裹到 object[]
?
如何强制 VBScript 将 returned 对象的类型识别为 ParseResult
而无需将其包装到 object[]
中?
谢谢!
你会为此自责,但你只需要使用 Set a = o.Parse(...)
而不是 a = o.Parse(...)
。
对于那些想知道为什么的人:a = o.Parse(...)
隐含地 Let a = o.Parse(...)
。 Let
用于赋值,Set
用于赋值对象。当使用 Let
分配一个对象时,它会将对象转换为一个值。我不记得该机制,但它可能使用涉及 IDispatch
and DISPID_VALUE
之类的标准 COM 技术。调用此转换时,.NET 框架中的某些内容返回对象的 ProgID 或完整的 .NET Namespace.ClassName。
如何将 C# 对象传递给 VBScript?
我的 C# class,我想要 return 是:
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# return 值传递。在这种情况下,VBScript 可以很好地迭代和重新调整对象类型和值。例如函数,returns 是这样的:
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 将 returned 对象的类型识别为字符串,而不是我的 class 类型,如果对象是直接 returned,但将类型识别为 ParseResult
,如果 returned 值被包裹到 object[]
?
如何强制 VBScript 将 returned 对象的类型识别为 ParseResult
而无需将其包装到 object[]
中?
谢谢!
你会为此自责,但你只需要使用 Set a = o.Parse(...)
而不是 a = o.Parse(...)
。
对于那些想知道为什么的人:a = o.Parse(...)
隐含地 Let a = o.Parse(...)
。 Let
用于赋值,Set
用于赋值对象。当使用 Let
分配一个对象时,它会将对象转换为一个值。我不记得该机制,但它可能使用涉及 IDispatch
and DISPID_VALUE
之类的标准 COM 技术。调用此转换时,.NET 框架中的某些内容返回对象的 ProgID 或完整的 .NET Namespace.ClassName。