在VBScript中确定.Net方法后缀号(COM-interop)

问题描述 投票:3回答:2

您可以在VBScript中通过COM-interop使用.NET方法。您必须在方法后附加一个后缀编号,因为重载不会跨越托管/非托管边界。后缀编号似乎没有特定的顺序......后缀编号是如何确定的?

例:

Dim encoding, bytesthroughdotnet
Set encoding = CreateObject("System.Text.UTF8Encoding")
    bytesthroughdotnet = encoding.GetBytes_4("你好Ğ") 'get bytes
    WScript.Echo LenB(bytesthroughdotnet) 'length
Set encoding = Nothing

怎么来_4用于GetBytes?

(这个问题跟随此response

.net vbscript com-interop overloading
2个回答
1
投票

微软文档Exported Member Conversion -- Overloaded Methods已经解释了所有。简而言之,@ Nilpo的答案是正确的,最快捷的方式通常只是反复试验。

重载方法

尽管.NET支持重载方法,但IDispatch接口仅依赖于绑定的方法名称,而不是完整的方法签名。因此,它无法支持重载方法。但是,为了提供对类型的重载方法的访问,Tlbexp.exe使用序号来装饰重载方法的名称,以便每个方法名称都是唯一的。

以下托管和非托管签名显示包含数字:

Managed signature

interface INew { public:
    void DoSomething();
    void DoSomething(short s);
    void DoSomething(short l);
    void DoSomething(float f);
    void DoSomething(double d);
}

Unmanaged signature

 interface INew {
    void DoSomething();
    void DoSomething_2(short s);
    void DoSomething_3(short l);
    void DoSomething_4(float f);
    void DoSomething_5(double d);
}

方法的COM签名显示为单个DoSomething方法,后跟一系列装饰的DoSomething_x方法,其中x从2开始,并为方法的每个重载形式递增。请注意,某些重载方法可以从基类型继承。但是,无法保证重载方法将保留与类型版本相同的数字。

虽然.NET客户端可以使用方法的重载形式,但COM客户端必须访问已修饰的方法。对象浏览器使用方法签名显示所有形式的修饰方法,以便您选择正确的方法。后期绑定客户端也可以调用IDispatch::GetIdsOfNames,传递装饰名称以获取任何重载方法的DispID。


1
投票

由于VBScript不支持重载方法,因此类中的每个重载方法都使用附加到其名称的数字进行唯一命名。它们按原始类中定义的顺序编号。有关ASP Free的文章Using .Net Interops in VBScript中的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.