2012-09-23 107 views
0

我已经在VB.NET(MSVS 2010)中编写了一个用“COM可见”和“Register for COM interop”标志启用的小类库。该库适用于Windows 2008终端服务器。我碰到了两个问题:在Windows上安装com-enabled .net程序集终端服务器

  1. 注册我的lib在服务器上。显然,拨打regasm.exe my_lib.exe /tlb是不够的。尽管regasm确实将 合适的密钥放入注册表中,但调用 CreateObject("My_lib_prog_id")会导致失败。我通过在 服务器上安装MSVS2010的试用版,暂时 解决了此问题,并在此处使用提升的权限运行它并构建了lib 。它的工作很好,直到...

  2. 作为另一个用户试图调用lib的COM客户端程序运行。它失败了。

编辑:“失败”意味着,VBA抛出,而这样做Set obj = CreateObject("MyLibProgID")“系统找不到指定文件”的例外。它在Visual Studio注册的相同用户帐户内工作正常。

我试着给执行acces到lib的目录给所有人,但它没有工作......任何想法,请吗?

UPDATE

如果客户端下运行任何其他用户,即使用户具有管理员权限的问题出现了。

+0

“......导致失败”,“......失败”。你能提供更多的细节吗? – Joe

+0

更新了问题 – AlexVhr

+0

也许运行fuslogvw会有所帮助。 – Joe

回答

2

好的,首先,我发现.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" 

然后我仔细看看生成的注册表文件,以确保它们位于正确的注册表配置单元中。

+0

感谢提及System.Runtime.InteropServices.COMException –

+0

1.是的,我做到了。 2.不,我不使用MSI。只是xcopy整个项目目录的部署,并尝试手动注册/ VS帮助3.我究竟如何“确保”它?不,早期绑定不是一种选择。 4.我不认为64/32的难题在这里存在错误 - 如果在注册的同一用户中运行,它会运行得很好。此外,请参阅更新 – AlexVhr

+0

我回归这些问题是打开MS Access/Excel并创建一个VBA模块。然后我转到“引用”来确认.net COM dll引用在列表中正确可用。有时你必须浏览到创建的* .tlb文件(而不是DLL)。如果在VBA中可以正常工作,那么CreateObject(“Namespace.Class”)应该可以在任何你想要的环境下工作,参见http://social.msdn.microsoft.com/Forums/pl/isvvba/thread/3fee8d3d-3a65-4d03 -b4c1-a9b55ece1ffc快速浏览技术。 –

相关问题