只是尝试使用 AppDomain.ExecuteAssembly 或其他任何方便的方法,在绕过 VBA 中的 AccessVBOM(对 Visual Basic 项目的编程访问不受信任)之后,以本地和远程方式在 VBA 中加载 CLR(.NET)程序集。
vba2clr.*.vba:
AccessVBOM 注册表项设置为 1Word.Application COM 对象(可以是 Excel.Application、MS PowerPoint、Access 等)。wordObj.Application.Run... 运行 ExecuteAssembly.vba 宏ExecuteAssembly.clr.2.0.vba: 支持 .NET 3.5 及以下版本
IDomain、ICRHost)AppDomain.ExecuteAssembly 所需的参数打包到两个独立的数组(变量、类型)中。AppDomain.ExecuteAssembly(Arg1, Arg2)(VFTable 偏移量 51),其中 Arg1 是“.NET 程序集 URL”或“本地路径”,Arg2 是返回值。AppDomain 方法的 VFTable 偏移量可以在 AppDomain IDL _AppDomain.idl 中查看,只需记住 AppDomain 接口继承自 IUnknown 接口,因此函数/方法的 VTable 偏移量从第三个偏移量开始,这是因为继承自 IUnknown 的接口,其 vtable 的前 3 个条目设置为 QueryInterface、AddRef、Release 方法。ExecuteAssembly.clr.x.vba: 支持 .NET 2、3.5 和 4.x
Word.Application(或 Excel.Application 等)创建 COM 对象,将会生成一个额外的 WinWord.exe,作为 svchost.exe 的子进程,而不是主 WinWord.exe 进程。AccessVBOM 注册表项通过 COM 使用 WScript.Shell 进行修改/恢复,使用 Win32 API 可能是更好的替代方案。AccessVBOM 注册表项更安全,这一点留到改天再谈……System.CodeDom.Compiler)可用于从 VBA 编译/执行 C# 代码,请参阅下面的参考;