2009-07-20 142 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。

相關問題