2008-10-30 115 views
9

我想知道在創建與其他項目相關的庫的發行版時,什麼是啓發式方法,以及是否應該包含它們。合併程序集的最佳做法?

我的問題是這樣的:

我有一個CommonUtilities庫,提供顧名思義一組可以在多個地方使用工具。 CommonUtilities的依賴包括log4net.dll(日誌框架)和Oracle.DataAccess.dll(數據庫驅動程序)。

我有另一個名爲MyProject的項目,我想包含CommonUtilities。MyProject也依賴於Oracle.DataAccess。

如果我使用ILMerge並將CommonUtilities合併到一個單獨的程序集CommonUtilities.dll中,並且從MyProject引用了所有的東西,但是我相信我應該顯式引用MyProject中的Oracle.DataAccess,因爲它是一個依賴項,並且不使用匯編合併到CU。由於有兩個Oracle.DataAccess程序集引用,因此添加對Oracle.DataAccess的引用也會導致模糊的使用語句。

在我的情況下使用ILMerge/Internalize會導致編譯錯誤,因爲來自內部化Oracle.DataAccess程序集的類型將從CommonUtilities返回並且它們被標記爲內部MyProject不會識別返回的類型。

使這項工作的唯一方法就是不要將這個特定的程序集(Oracle.DataAccess)合併到CommonUtilities中,而只是從MyProject中引用它。 這反過來又產生了一個新問題:我應該引用哪個Oracle.DataAccess.dll - 是否與CommonUtils一起分發的依賴項?

還有其他方法可以解決這一切嗎?

+0

我撓我的頭ilmerge - 我沒有看到一個優勢,將所有組件在一個文件中。任何人都在照顧我? – cfeduke 2008-10-30 15:07:46

回答

5

短,易於版本:

給定議會一個進程中的每個參考應該是同一個版本。

如果不這樣做,你可能會陷入深深的煩惱,因爲應用程序的一部分不能與另一由於版本不匹配。

即使使用「真正私有」的東西,比如log4net,你可能會錯過共享配置空間的可能性,就像在應用程序的所有部分使用公共根記錄器一樣。當然,在這種情況下,最終的呼叫是 - 與往常一樣 - 與負責任的開發人員。

另請參閱有關ILMerge and 3rd party assemblies的其他問題。

+0

從技術角度而言,「由於版本不匹配,應用程序的一部分無法與另一部分通話」是指您的意思。如果你能更具體一點,會很棒。 – bentayloruk 2011-06-16 11:25:51

0

我想可能有一些優勢,有關於保持一堆局部組件的一個(我這,甚至不相信你能做到)

我不會從其他廠商合併圖書館 - 因爲他們經常有他們自己的許可,更新它們需要你重新分配一個新版本的代碼。

如果您有許多庫來保持目錄整潔,或者確保某些代碼總是與主執行程序集一起,那麼合併自己的庫可能會有所幫助。

我認爲ILMerge在將庫合併到EXE中時效果更好,因此您只有一個文件而不是多個文件。

1

我們根本不合並庫。我無法看到將圖書館合併在一起的很多優勢,您無法得到,只是首先將它們構建在一個程序集中。

我可以看到合併庫與EXE的好處。這可能是真正方便的。將庫合併在一起的問題是,它們可能在EXE中具有不同版本的依賴關係,並可能導致不舒服的同牀異形。

我不認爲將dll合併在一起可能被認爲是最佳實踐,除非將它們合併到EXE中以呈現單個文件而不是多個文件。

4

我們使用ILMerge的最大原因是讓我們的混淆步驟難以扭轉。通過使用/ internalize標誌將它們合併在一起,混淆器可以重新命名我們合併到父程序集中的公共類和方法。

從IL合併文檔: 「[內在]控制是否類型在比所述主組件的其他組件已經它們的可見性改性當它是真實的,那麼所有的非豁免類型是其組件的外部可見有它們的可見性修改,以便它們從合併裝配體外部不可見「

如果組件保持獨立,那麼混淆器將不會重命名它們。

BTW Eazfuscator是真棒,和自由: http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx