我有一个用C#编写的.NET程序集。它标记为ComVisible,有guid,签名,regasm'd(/ codebase)。我没有正式定义COM部件的接口。
我通过VBscript使用这个程序集。
有一个重载方法 - 一个表单需要一个字符串参数,第二个表单需要两个字符串。两者都从同一个程序集返回另一个.NET类型。我称之为:
set foo = WScript.CreateObject("Prog.Id")
' the following succeeds
set bar = foo.Method1("string")
' the following fails
set baz = foo.Method1("string1", "string2")
第一次调用Method1成功。第二个失败了 “错误的参数数量或无效的属性赋值”。
我该如何调试?
在测试中,如果我用这样的重载来定义脑死亡的简单.NET类,我可以从VBScript调用它,没问题。我的“真实”装配还有其他一些因素导致失败。我怎么弄清楚它是什么?
答案 0 :(得分:4)
我不确定这是否真的如此,但似乎COM不允许重载方法:here或here
第一个链接似乎暗示可能有一种解决方法(可能有明确的接口定义和属性?),但我对此表示怀疑。
您还可以使用OleView.exe检查生成的类型库,以便在程序集上使用tlbexp后查看COM客户端的两种方法。
答案 1 :(得分:2)
更多相关内容:虽然COM不允许“允许”重载方法,但在使用重载方法的.NET类上生成的CCW将暴露所有重载。换句话说,像VBScript这样的基于COM的环境将能够访问.NET类上的所有重载。一些重载会导致名称损坏。
假设有一个类暴露了名为Extract()
的三个方法。第一个重载名为Extract()
。其他名称后缀为_2和_3。
什么决定哪个重载是“第一个”重载,哪个重载得到了错误?我不知道。它可能是组装中方法的出现顺序。但是什么决定了这个秩序?在这里,我不知道。
我知道的唯一方法是确定哪个重载是哪个,也就是在OleView中查看CCW。