Visual Basic - 调用.net运行时

时间:2017-10-11 15:30:39

标签: .net vba excel-vba com excel

我正在尝试从VBA(Word / Excel)调用来自.net运行时的对象。 这有效: oT = CreateObject("System.Text.UTF8Encoding") 但不是这个: CreateObject("System.Management.Automation.Runspaces.RunspaceFactory") 错误是: 运行时错误' 429' ; ActiveX组件无法创建对象

我不明白Excel / Word如何确定哪些类暴露,哪些不是

1 个答案:

答案 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无法创建对象”。