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

Eug*_*ene 5 .net vbscript overloading com-interop

您可以通过 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
Run Code Online (Sandbox Code Playgroud)

为什么 _4 用于 GetBytes?

(此问题遵循此回复

Aim*_*ast 2

Microsoft 文档导出成员转换 - 重载方法已经解释了所有内容。简而言之,@Nilpo 的答案是正确的,最快的方法通常只是尝试和错误

重载方法

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

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

托管签名

interface INew { public:
    void DoSomething();
    void DoSomething(short s);
    void DoSomething(short l);
    void DoSomething(float f);
    void DoSomething(double d);
}
Run Code Online (Sandbox Code Playgroud)

非托管签名

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

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

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