2011-05-02 34 views
6

我想創建一個 dll即合併與第三方DLL。這意味着最終消費者只需要處理1個dll而不是2個。合併DLL和更改管理命名空間

對於擴充的緣故,可以說第三方dll是nLog。如何處理合並後的dll的用戶已在其項目中引用NLog作爲參考的情況?

理想情況下,我希望能夠做的是將我的項目中的NLog命名空間更改爲「XyzNLog」,這意味着用戶不需要做任何別名...任何想法我可能會這樣做?

現在我知道我可以添加別名到我的項目NLOG讓我不得不把它稱爲XyzNLog,但我想同樣要結轉到消費者合併後的dll文件,使從未有衝突。

更新 - 解決方案

http://blog.mattbrailsford.com/2010/12/10/avoiding-dependency-conflicts-using-ilmerge/

賓果!所以通過使用ILMerge,它變爲 可能合併第三方 庫DLL與提供者 自己的DLL,這意味着我們將只有一個 DLL部署。 但是,這還不是全部,我們 實際上可以走一步,並 告訴ILMerge以內在所有 依賴。這是什麼 將所有第三方類別 轉換爲內部聲明,意思是 ,它們只能從 最終DLL中使用。嗚呼!問題解決了=)

鑑於這一問題在我的DLL的消費者也可以有NLOG消失了......我的引用NLOG轉移到爲所有內部!這正是我想要的。

有沒有人對此有任何反饋或想法?

+9

是的,這有DLL地獄寫在它的全部。最糟糕的一種,自我誘導的那種。這是沒有辦法的。 – 2011-05-02 02:06:55

+0

@Hans Passant:所以如果我的組件使用nLog版本x,我必須*強制*我的客戶使用nLog *的版本x作爲他們的東西*太沒有別的了?必須有解決方案,對吧? – 2011-05-02 06:05:23

+0

@zespri這是一個類似的情況,我在,但我不想使用GAC,我不希望我的DLL的用戶不必擔心這個實現細節......所以這就是爲什麼我期待尋求解決方案,並感受到必須有的東西。 – 2011-05-02 10:47:42

回答

1

我同意漢斯,我強烈建議單獨註冊DLL。

否則,你可能會在DLL地獄,這將驅動你的消費者。

然後,您可以制定一些聰明的部署方法來檢測,如果DLL已經被註冊,等

0

我有@Hans帕桑特(和here's some info對經常討論的DLL地獄)同意,但因爲你問過這個問題,我會盡力回答。

你可以捆綁第三方DLL作爲資源。詳情請致電see this question

至於你的其他問題,我只是暴露從第三方DLL相關的類在你自己的命名空間,也許使用擴展方法來提供你想要的任何附加功能。例如,您可以在您的代碼中使用靜態方法(例如XyzNLog.Logger.Log())來提供對NLog的Log()方法的訪問,例如在代碼內部(靜態構造函數或任何其他您喜歡的內容)處理初始化和內部任何其他操作。 由於您使用上述方法加載NLog程序集,因此您將成爲唯一可以直接訪問嵌入式NLog程序集的用戶,並且用戶將無法訪問它。現在,你沒有得到讓所有類從NLog自動出現的好處,在這種情況下你仍然需要手動公開它們。

編輯:另一種方法是嘗試使用ILMerge與/內在標誌as described here。您可能無法完全解決問題,但請查看at this article以查看是否可以避免作者描述的陷阱。擾流警報:這並不是所有的桃子,但它可能會起作用,並有足夠的額外努力。

+0

在這裏的例子中,我沒有得到的部分是靜態方法Logger必須返回一個類型......我將返回什麼類型如果我的項目中沒有對NLog的引用? – 2011-05-02 02:51:48

+0

@vdh_ant,Logger類是你的類包裝NLog的記錄器,你通過反射使用我引用的鏈接獲得。換句話說,你公開你自己的類而不是NLog's。你總是可以暴露接口('ILogProvider'),但無論哪種情況,你都不會有編譯時訪問NLog的類,唯一的運行時訪問將通過反射或類似的方式進行。 – dawebber 2011-05-02 03:31:37

+0

Humm,所以如果我打包的類dll有一個更復雜的API,那麼它更難:( – 2011-05-02 10:45:24