好的,首先,我发现 .net COM dll 与 VBA 交互存在许多问题。
首先,通过属性在 .net 中配置它们,因此在注册表中正确配置它们很重要。确保 Dll 项目已标记为注册 COM 互操作。
其次,如果您使用 MSI 项目,请确保该软件已标记为“安装所有用户”。MSI 项目在删除注册表项方面做得很差,所以如果你搞砸了 MSI 安装、.net 版本等,你的服务器最终会出现“错误的注册表项”。我最终使用 regasm.exe 正确注册组件。我最终转向 WIX 项目安装。
第三,对于终端服务器,您需要确保注册表条目是“机器/全局”范围的,因为每个用户将运行一组可能不同的“注册表”条目。如果您正确设置了命名空间,您应该能够在 VBA 中进行早期绑定,而不是风险更高的后期绑定“CreateObject”调用。只需确保 VBA 在启动期间检查“损坏的引用”即可。
第四,我使用一个非常干净的 VM 来测试我的安装和注册表项,在 MS Office VBA 参考的帮助下,确认 COM 部分已正确注册,因此“CreateObject”调用不会失败。
第五,注意终端服务器的 x86/x64 问题以及您运行的显式 Office 版本(尤其是 Office 2010 x64)。如果服务器是 x64,您可能必须显式使用编译器标志 /86(任何 CPU 都可能对 VBA .net COM 对象非常不利)。
第六,注意从 .net 向 COM 引发异常的方式。查看 System.Runtime.InteropServices.COMException 以了解正确的方法。
From cmd
c:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727{or the edition your using}
COPY "\\Distribution Share\{YourCompany}\{Software}\{Edition}\{.net Com DLL name}.dll" "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll"
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /u
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /regfile:"C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg" /codebase
cd C:\WINDOWS\System32\
Regedit.exe /s "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg"
然后,我仔细查看了生成的注册表文件,以确保它们位于正确的注册表配置单元中。