2009-07-20 141 views
2

我有一个.NET程序集,用C#编写。它被标记为ComVisible,有一个GUID,被签名,regasm'd(/ codebase)。我没有正式定义COM部分的接口。如何调试“错误数量的参数或无效的属性分配”VBScript interop

我通过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调用它,没问题。还有一些关于我的“真实”组件会导致这种失败。我如何弄清楚它是什么?

回答

2

我不知道这是否是真正的情况,但现在看来,COM不允许的方法重载:herehere

第一个环节似乎表明,有可能是解决的办法(有明确的接口定义和属性?),但我怀疑它。

您还可以使用OleView.exe检查生成的类型库,以便在组件上使用tlbexp后,查看COM客户机的两种方法。

+0

啊,是的,我认为这是答案。 – Cheeso 2009-07-20 17:37:08

0

更多相关内容:尽管COM不允许重载方法,但在使用重载方法的.NET类上生成的CCW将公开所有重载。换句话说,像VBScript这样的基于COM的环境将能够访问.NET类中的所有重载。一些重载得到了重名的名字。

让我们假设有一个类暴露了名为Extract()的三种方法。第一个过载名为Extract()。其他人以后缀_2和_3命名。

什么决定了哪个超载是“第一个”超载,哪个超出名称?我不知道。这可能是程序集中方法出现的顺序。但是什么决定了这个顺序?这里又一次,我不知道。

我知道的唯一方法就是确定哪个超载是在OleView中查看CCW。

相关问题