我有一個託管程序集包含幾個類,並且這些類具有重載的方法。我通過在COM互操作(CCW)中重載 - IDispatch名稱包含後綴(_2,_3等)
[ComVisible(true)]
暴露大會COM/IDispatch接口調用方..和還設置適當的Guid,在大會本身。我沒有爲COM互操作定義明確的接口。這一切都是動態完成的。我在受管DLL上運行regasm.exe /codebase
,並將其註冊爲COM互操作。
當我運行OLEVIEW,我能看到的各種類的ProgID的組件中。但是,瀏覽這些ProgIds並擴展IDispatch節點時,這些類沒有TypeLib信息。
即使如此,從腳本,我可以調用接受零個參數或接受一個參數的方法的方法。如果還有一個接受多個參數的重載,我不能通過名稱調用該方法。我得到的錯誤,始終如一,是
Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: <methodname>
從此我明白了COM/IDispatch的客戶不能夠妥善解決通過COM互操作暴露的對象上重載方法。
然後我說
[ClassInterface(ClassInterfaceType.AutoDual)]
...每一個有問題的類。在DLL上的regasm.exe
之後,我可以在IDispatch節點下看到每種方法的typelib信息。
我發現,重載方法會自動獲取包含附加後綴的名稱。 MethodX會將自動生成的typelib程序集中的重載公開爲MethodX,MethodX_2,MethodX_3等。
而且我發現,與那些後綴引用方法名,我可以調用重載方法,雖然不能與通用名稱。
更有趣的是,如果我然後從類除去[ClassInterface(ClassInterfaceType.AutoDual)]
,我可以仍然調用以這種方式重載方法,從而避免了錯誤Wrong number of arguments or invalid property assignment
。
我的問題是:是這樣的行爲 - 追加數字後綴成員名稱 - 穩定嗎?記錄?可信?
注意:使用VB.NET時,此技術(兩個重載只根據可選參數的不同)需要VS 2012。 – Heinzi 2012-11-21 14:46:41