2011-08-01 61 views
2

我有其在2010年VS創建據公開爲COM(ATL)一個C++ DLL項目不合格。我用這個DLL到另一個.NET項目作爲參考。 C++項目連接器設置設置如下:COM DLL登記TFS 2010

 
­"Register Output" = Yes 
"Per-user Redirection = Yes 

我創建了一個生成定義建立在TFS這兩個項目2010年C++項目的基礎很好,但因爲C++項目的輸出DLL沒有註冊.NET項目失敗。設置爲「每用戶重定向」= false不起作用。我也嘗試使用WF活動'InvokeProecss'來註冊使用Regsrv32 /批處理文件/我自己的EXE等C++ DLL,但我得到退出代碼5.我的TFS 2010是在Windows 2008 Server R2中。我想,它並不像管理員那樣運行這個過程。

如果我使用生成一個TLBIMP互操作DLL,然後我指在我的.NET proejct是互操作,它工作正常(oviously在TFS生成,我需要添加InvokeProecss調用TLB)。但這是不可接受的,因爲我們的一般做法是直接從.NET項目引用COM DLL。

任何人可以請幫助這件事嗎?

是否有一種方式來運行自動構建活動「InvokeProcess」以管理員身份的TFS不提示用戶名/密碼?

+2

參照直接一個COM DLL是不可能的,tlbimp.exe是總是需要。在構建服務器上註冊COM服務器是一種可怕的做法,只會產生註冊表污染。沒有必要。只需運行tlbimp.exe,不需要管理員權限。 –

回答

2

默認情況下,TFS構建服務運行作爲這是一個相對低特權帳戶「網絡服務」帳戶。或者,您可以將其配置爲以您喜歡的任何域名帳戶運行。然而,我不會推薦你作爲所描述問題的解決方案。我同意Hans的觀點,在這種情況下,最好使用類型庫導入程序(TlbImp.exe)從管理程序集中「引用」COM服務器。

如果COM對象不改變,你可以使用類型庫導入生成一個互操作程序集,請檢查並從你的.NET項目中引用它。如果更改爲,則可以添加生成後步驟以生成interop程序集,而不是使用InvokeProcess活動。正如Hans所指出的那樣,您實際上不能從託管程序集中直接引用COM對象直接。在解析對已註冊的COM服務器的引用後,您的引用實際上會導致在構建時生成一個互操作程序集。

+0

謝謝你們,我終於結束了使用域用戶的一個運行進程,以便tfs可以註冊COM。我也同意Hans的觀點,我提到它可以很好地適用於tlbimp,但它只是我們的開發人員,他們習慣於編譯COM項目,並直接將其引用到.NET項目中,而不是使用tlbimp創建互操作。無論如何..感謝您的幫助 –