我有一个在VS 2010中创建的C ++ DLL项目。它公开为COM(ATL)。我将这个dll用作另一个.NET项目作为参考。 C ++项目链接器设置如下:
"Register Output" = Yes "Per-user Redirection = Yes
我创建了一个构建定义来在tfs 2010中构建这两个项目.C ++ Project构建正常,但.NET项目失败,因为C ++项目的输出dll未注册。设置为“每用户重定向”= false不起作用。我也尝试使用WF活动'InvokeProecss'来使用Regsrv32 /批处理文件/我自己的exe等注册c ++ dll,但我得到退出代码5.我的TFS 2010在Windows 2008 Server R2中。我认为,它不是以管理员的身份运行这个过程。
如果我使用tlbimp生成一个interop dll,然后我在我的.NET proejct中引用了interop,它运行正常(显然在tfs构建中,我需要添加InvokeProecss来调用tlb)。但这是不可接受的,因为我们的一般做法是直接从.NET proejct引用COM dll。
有人可以帮忙解决这个问题吗?
有没有办法在没有提示输入用户名/密码的情况下以管理员身份运行tfs自动构建活动'InvokeProcess'?
答案 0 :(得分:2)
默认情况下,TFS Build Service作为“网络服务”帐户运行,该帐户是一个相对低权限的帐户。或者,您可以将其配置为以您喜欢的任何域帐户运行。但是,我不建议将其作为您所描述问题的解决方案。我同意汉斯的观点,在这种情况下,最好使用类型库导入程序(TlbImp.exe)从托管程序集“引用”您的COM服务器。
如果COM对象没有更改,您可以使用类型库导入程序生成互操作程序集,检查它并从.NET项目中引用它。如果 更改,则可以添加生成后步骤以生成互操作程序集,而不是使用InvokeProcess活动。正如Hans指出的那样,您实际上无法从托管程序集直接引用COM对象 。您的引用实际上导致在解析对已注册的COM服务器的引用后,在构建时生成interop程序集。