时指定调用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]包装器。 –