好的,首先,我发现.NET COM COM dll与VBA交互有很多问题。
首先,用.net通过属性配置它们,以便它们在注册表中正确配置很重要。确保Dll项目已被标记为注册COM互操作。其次,如果您使用MSI项目,请确保该软件已标记为“安装所有用户”。 MSI项目在删除注册表项方面做得非常差,所以如果你把MSI安装,.net版本等搞糟了,你的服务器最终会出现“坏的注册表项”。我最终使用regasm.exe正确注册组件。我最终转向了WIX项目安装。
第三,您需要确保注册表项是终端服务器的“机器/全局”范围,因为每个用户都将运行一组潜在的“注册表”项。如果您已经正确设置了名称空间,那么您应该能够在VBA中进行早期绑定,而不是风险较大的后期绑定“CreateObject”调用。只要确保VBA在启动过程中检查“断开的引用”。第四,我使用非常干净的虚拟机来测试我的安装和注册表项,在MS Office VBA引用的帮助下,确认COM部件已经正确注册,所以“CreateObject”调用不会失败。第五,小心终端服务器和办公室的显式版本(特别是Office 2010 x64)的x86/x64问题。如果服务器是x64,则可能必须显式使用编译器flags/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"
然后我仔细看看生成的注册表文件,以确保它们位于正确的注册表配置单元中。
“......导致失败”,“......失败”。你能提供更多的细节吗? – Joe
更新了问题 – AlexVhr
也许运行fuslogvw会有所帮助。 – Joe