2010-09-10 52 views
2

我已經在C#中聲明瞭COM可見類。代碼如下:C#COM類 - DISP_E_UNKNOWNNAME

[ComVisible(true)] 
public class AComVisibleClass : TheParentClass 
{ 
    public bool SomeFunc(string id) 
    { 
     return true; 
    } 

} 

該類由工廠類實例化,也可COM訪問。

但是,如果我嘗試在一個VB腳本文件來訪問,一個DISP_E_UNKNOWNNAME拋出異常。

這是我們在這裏工作的預先存在庫中的新類。所有其他類都可以通過COM訪問。整個庫被編譯成一個彙編文件。我已經使用regasm註冊了新程序集,但我仍然得到此例外。

我試圖調試使用VS2008的COM調用。工廠類似乎能夠實例化AComVisibleClass。上述例外僅在工廠試圖執行SomeFunc時引發。

我知道這聽起來可能有點(?)有點模糊,但我不能在這裏暴露真正的代碼。如果有人需要更多信息,請問我。

+0

您可以將您的VBScript代碼(剛夠看到通話的樣子)? – 2010-09-10 22:21:46

+0

問題出在VBScript代碼中。您沒有發佈該代碼。 – 2010-09-11 13:30:40

回答

4

我能想到的這個問題的三種可能原因:

原因1:在創建對象使用了錯誤的名稱:

我想,你的VBScript代碼調用 像 這樣:

Set obj = CreateObject("MyLibrary.AComVisibleClass") 

如果這是正確的,那麼請打開註冊表編輯器,並檢查HKEY_CLASSES_ROOT密鑰是否包含調用的子項MyLibrary.AComVisibleClass。 如果沒有,那麼您的圖書館名稱可能與您的預期不同。在註冊表中搜索AComVisibleClass以查找正確的庫名稱。

原因2:64位問題:

如果問題在64位操作系統上發生,其原因可能是你的VBScript運行作爲一個32位進程和C#COM DLL是64位或反之亦然。

原因3:錯誤函數名稱:

你可能是在腳本中使用了錯誤的函數名稱,例如obj.SomeFnc(1)而不是obj.SomeFunc(1),或者您選擇的函數名稱是VBScript中的保留關鍵字,或者它包含不常用的字符。

+0

我能夠找出發生了什麼事。我只能說我的問題稍微複雜一點,我在這裏描述......但這是最有用的答案,所以會被接受。 – rsenna 2010-09-13 14:52:56

0

聽起來像是你需要支持IDispatch

退房Does C# .NET support IDispatch late binding?

編輯

這個答案很可能錯了,我還可以風將其刪除。現在,它似乎增加了價值,所以我會讓它留下來。

+0

.NET在默認情況下爲ComVisible提供了雙接口(即包括IDispatch),所以這不應該成爲問題。 – 2010-09-10 22:20:40

+0

@Pavel,你說得對。它看起來像'IDispatch'被實現,但調用者沒有傳入正確的名稱。 (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants.disp_e_unknownname(VS.80).aspx)它是否區分大小寫? – 2010-09-10 22:29:34