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.dll
的 InprocServer32
子项,并且如果 VBA 运行时成功创建了该类型中具有指定 ProgId
的类型的实例库,然后 CreateObject
调用成功并且 returns 实例。否则,它会抛出错误 429 并显示 "ActiveX can't create object".
我正在尝试从 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.dll
的 InprocServer32
子项,并且如果 VBA 运行时成功创建了该类型中具有指定 ProgId
的类型的实例库,然后 CreateObject
调用成功并且 returns 实例。否则,它会抛出错误 429 并显示 "ActiveX can't create object".