我正在尝试从VBA(Word / Excel)调用来自.net运行时的对象。
这有效:
oT = CreateObject("System.Text.UTF8Encoding")
但不是这个:
CreateObject("System.Management.Automation.Runspaces.RunspaceFactory")
错误是:
运行时错误' 429' ; ActiveX组件无法创建对象
我不明白Excel / Word如何确定哪些类暴露,哪些不是
答案 0 :(得分:3)
调用CreateObject
时指定的参数不是名称空间,它是ProgId
- COM用于查找已注册类的字符串(以及它们定义的库)在Windows注册表中,以及该库所在的位置。
如果没有ProgId
值为System.Management.Automation.Runspaces.RunspaceFactory
的已注册COM类型,则ActiveX无法创建该对象。
如果命名空间没有COM类型库(即程序集没有为COM互操作注册),那么您正试图让COM了解.NET /托管代码,而它无法做到。
我不明白的是Excel / Word如何确定哪些类暴露,哪些不是
Excel / Word /任何主机应用程序与它无关,它是VBA自己的运行时加载COM类型,而Windows注册表包含ProgId
所有已注册的内容。
如果您在注册表中搜索Scripting.Dictionary
下的HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
,您最终会找到一个名为{EE09B103-97E0-11CF-978F-00A02463E06F}
的密钥,其中ProgID
子密钥的值为{{1和Scripting.Dictionary
子键,其值为InprocServer32
,如果VBA运行时成功创建该类型库中具有指定C:\Windows\system32\scrrun.dll
的类型的实例,则{{} 1}}调用成功并返回实例。否则,它会抛出错误429并说“ActiveX无法创建对象”。