Visual Basic - 调用 .net 运行时

Visual Basic - invoking .net runtime

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

我不明白的是 Excel/Word 如何确定哪些 类 已公开,哪些未公开

您在调用 CreateObject 时指定的参数不是 命名空间 ,它是 ProgId - COM 用于定位已注册的字符串 类(以及定义它们的库,以及该库所在的位置),在 Windows 注册表中。

如果没有 ProgId 值为 System.Management.Automation.Runspaces.RunspaceFactory 的已注册 COM 类型,则 ActiveX 无法创建该对象。

如果命名空间没有 COM 类型库(即程序集未注册 COM 互操作),那么您正试图让 COM 理解 .NET/managed 代码,但它不能做。

What I don't understand is how Excel/Word determines which classes are exposed and which aren't

Excel/Word/whatever 主机应用程序与它无关,它是 VBA 自己的运行时加载 COM 类型,它是包含 [=11] 的 Windows 注册表=] 已注册的所有内容。

如果您在注册表中搜索 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID 下的 Scripting.Dictionary,您最终会找到一个名为 {EE09B103-97E0-11CF-978F-00A02463E06F} 的项,其 ProgID 子项的值为 Scripting.Dictionary 和值为 C:\Windows\system32\scrrun.dllInprocServer32 子项,并且如果 VBA 运行时成功创建了该类型中具有指定 ProgId 的类型的实例库,然后 CreateObject 调用成功并且 returns 实例。否则,它会抛出错误 429 并显示 "ActiveX can't create object".