時指定調用CreateObject
不是命名空間的說法,它是一個ProgId
- 一個字符串COM用於在Windows註冊表中查找註冊類(以及它們定義的庫以及該庫所在的位置)。
如果沒有使用ProgId
值System.Management.Automation.Runspaces.RunspaceFactory
的註冊COM類型,則ActiveX無法創建該對象。
如果沒有用於名稱空間的COM類型庫(即該程序集沒有爲COM互操作註冊),那麼您試圖讓COM瞭解它無法執行的.NET /託管代碼。
我不明白的是Excel中/ Word確定哪些類是暴露的,哪些不是
的Excel /字/任何主機應用程序無關,它是VBA自己的加載COM類型的運行時,它是Windows註冊表,包含ProgId
註冊的所有內容。
如果您搜索HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
下你對註冊表Scripting.Dictionary
,你最終會找到一個名爲{EE09B103-97E0-11CF-978F-00A02463E06F}
鍵,用ProgID
子項具有Scripting.Dictionary
值和InprocServer32
子項與C:\Windows\system32\scrrun.dll
的值,如果VBA運行在成功創建該類型庫中指定的ProgId
類型的實例,然後CreateObject
調用成功並返回該實例。否則,它會拋出錯誤429並說「ActiveX無法創建對象」。
簡單:Excel/Word甚至不會遠程參與。這是VBE的工作,而不是主機應用程序的工作。 –
那麼VBE如何知道什麼是可訪問的,哪些不可以? – Konrads
只有.NET類的一個子集是[ComVisible(true)]。大部分是.NET 1.0中的東西,當讓程序員轉向.NET的潮流並不強迫他們重寫他們所擁有的所有東西時,仍然很重要。你必須創建你自己的[ComVisible]包裝器。 –