2012-01-12 68 views
5

形勢
我運行執行許多建造了許多項目構建系統。爲了避免一個構建影響另一個構建,我們將構建用戶鎖定到其工作空間。構建以只有工作區寫入能力的非特權用戶運行。如何C#簡單地使用傳統DLL未經登記(REGSVR32)

挑戰
在我們新的版本,我們需要使用傳統的3rdParty DLL通過COM公開其接口。開發團隊想要註冊構建(regsrv32.exe),但我們的構建安全機制阻止此活動。如果我們放鬆政權然後第三方DLL會影響其他版本,如果我有兩個版本需要兩個不同的版本,我可能有錯誤的版本編譯錯誤(非常現實的可能性)。

問題
是否有登記之外的其他任何選項來處理遺留的DLL其中暴露通過COM它們的接口?

感謝您的幫助

彼得

+0

在.NET中COM通常是通過Interop完成的,以便在.NET中註冊.DLL,它們被稱爲程序集,可以通過多種方法完成......通過在項目級別通過VS IDE添加引用或編寫代碼並通過.Config文件卸載程序集,該文件具有對程序集的引用以及在該項目中對該引用的使用... GAC .. – MethodMan 2012-01-12 21:45:12

+0

當您構建時,註冊是永遠不需要的。 COM使用類型庫來公開接口。如果你看到Regasm.exe被使用,那麼你做錯了。使用Tlbexp.exe – 2012-01-12 22:43:26

回答

2

有一個關於免註冊COM的演練在這裏:

http://msdn.microsoft.com/en-us/library/ms973913.aspx

而痛苦的細節在這裏: http://msdn.microsoft.com/en-us/library/aa376414 (該文件的根實際上是在這裏:http://msdn.microsoft.com/en-us/library/dd408052

而且,一般來說,你應該能夠使用Tlbimp或tlbexp創建一個可用於構建的TLB文件,假設註冊點只是爲了能夠成功編譯,而不是運行特定的測試秒。

1
  • 如果您有機會獲得第三方.DLL的,你可以GAC他們,在你的項目中引用它們
  • 您可以在使用添加你.cs文件頭以及通過右鍵單擊引用添加引用項目 - >添加引用...
  • 您還可以執行上述步驟以及在該屬性中設置copy local = true .dll ..我希望這給你一些想法..請記住,.NET程序集是託管代碼,因此有多種方法可以使用C#中的其他方法來使用這些第三方.DLL,如LoadFromAssembly等。
1

安裝工具(如Installshield)可以從DLL並將它們添加到註冊表中。它也可以使用DLL的自我註冊過程(我相信它是regsvr所做的),但這不是Microsoft installer best practice

0

感謝您的幫助。我們從早期綁定改爲後期綁定,因爲我們在編譯時並不需要DLL。這將註冊要求從構建服務器推送到集成測試服務器(我們執行處理註冊的安裝程序)。我們儘量保持構建系統的原始狀態並具有易於重置的集成系統。

再次感謝 彼得

6

對於我原來的回答類似的問題,請參閱:TFS Build server and COM references - does this work?

編譯引用COM組件沒有被登記在構建服務器是COM組件.NET代碼的一個好辦法在項目/構建文件中使用COMFileReference參考項而不是COMReference。一個COMFileReference項目看起來是這樣的:

<ItemGroup> 
    <COMFileReference Include="MyComLibrary.dll"> 
    <EmbedInteropTypes>True</EmbedInteropTypes> 
    </COMFileReference> 
</ItemGroup> 

由於Visual Studio提供了COMFileReference沒有設計師的支持,你必須編輯項目/手工打造的文件。

在構建期間,MSBuild從COM DLL中提取類型庫信息,並創建一個interop程序集,該程序集可以是獨立的或嵌入調用的.NET程序集。

每個COMFileReference項目也可以有一個WrapperTool屬性,但默認情況下似乎對我來說很好。 EmbedInteropTypes屬性沒有記錄爲適用於COMFileReference,但它似乎按預期工作。

請參閱http://msdn.microsoft.com/en-us/library/bb629388.aspx瞭解更多細節。這個MSBuild項目自.NET 3.5起可用。

這是一個恥辱,沒有人似乎知道任何關於這種技術,這對我來說似乎比替代品簡單。這實際上並不令人意外,因爲我只能在網上找到上面提到的那個。我自己通過挖掘MSBuild的Microsoft.Common.targets文件發現了這種技術。