2011-05-18 93 views
1

我對幾個COM組件有依賴關係。我的項目是託管的。我想確保最新版本的COM DLL是預先註冊的。我已經在預構建步驟中在DLL中添加了regsvr32調用,但它似乎永遠不能正常工作。項目建成時,它抱怨該類型沒有註冊。我有孤立和非孤立的組件。C# - 在預生成事件期間註冊第三方COM DLL

人們如何處理這種情況? regsvr32是唯一的答案嗎?爲什麼MSBuild沒有注意到這些類型已被註冊?

+0

我想到的問題是:這些依賴關係是否真的發生了變化,以至於它們必須作爲預構建步驟進行註冊?如果項目尚未註冊,那麼該項目如何開發以引用它們?你是在做這個來配置自動構建,還是從IDE內部構建? – 2011-05-18 17:14:10

+0

regsvr32的返回值是多少?你需要提升(使用UAC運行Vista/Win7)嗎? – Richard 2011-05-18 17:14:38

+0

@Joel - 在乾淨的環境中拉伸乾淨的構建會導致這種類型的失敗。在一個大型項目中,即使它是多餘的,你也確實需要這種類型的東西。我會做類似的事情,以便構建可以在一個步驟中執行。 – 2011-05-18 17:17:30

回答

1

Regsvr32是在註冊表中註冊您的typelib和COM服務器信息的方式。這是一個微不足道的過程,我很驚訝它不起作用。你是否已經手工驗證過程,以確保它不是別的,比如爲regsvr32提供了錯誤的路徑?

+0

好的....現在我可能已經失敗了,我已經把它弄糊塗了一點。如果該路徑對DLL無效,那麼構建將會成功,但是regsvr32會靜默失敗。發生這種情況時,如何使構建失敗?如果交換機錯誤,構建失敗,但如果文件路徑錯誤則構建失敗。 – 2011-05-18 17:24:46

+0

@Adam - 如果有人因爲導致運行時問題並且不會構建問題而丟棄路徑,我不會失敗。我將它看作類似於讓某些人混淆構建工件的輸出路徑。這並不是真正意義上的構建失敗。 – 2011-05-18 18:03:00

+0

我絕對認爲這是一個構建問題。該DLL未正確註冊,因此C#程序集無法構建,因爲它不知道COM DLL的位置。由於註冊失敗而未能建立,只會更快地發現問題。 – 2011-05-18 18:08:53

0

我通過調用批處理腳本解決了這個問題:

$(ProjectDir)register.bat "$(SolutionDir)" 

批次:

regsvr32 "%~1ThirdParty\comdll1.dll" /s 
if %ERRORLEVEL% NEQ 0 GOTO Exit 
regsvr32 "%~1ThirdParty\comdll2.dll" /s 
if %ERRORLEVEL% NEQ 0 GOTO Exit 
regsvr32 "%~1ThirdParty\comdll3.dll" /s 
EXIT: 

的問題是,Visual Studio可以只檢查ERRORLEVEL值一次,在最後。如果comdll2註冊失敗,但comdll3成功,那麼ERRORLEVEL將爲0,並且構建不會失敗。