2013-02-28 86 views
1

因爲我使用Castle's DynamicProxy(特別是「無目標接口代理」)來執行自定義處理方法調用的攔截,所以我有一個內部依賴於Castle.Core.dll的.NET庫。由於我的程序集是強命名的,因此我想使用ILMerge將我的所有依賴項合併到一個部署程序集中,將我的依賴項的類型內化,以便不會不必要地將它們公開給我的客戶。這是NuGet情況下,如果,如果我的組件強命名的,我有我的包依賴關係設置爲具體版本的依賴,或裝配名稱解析休息尤爲重要,因爲Castle.Core.dll也強名稱。請注意,將我的項目作爲強名稱程序集發佈是我的用戶所重視的一項功能,因此不能刪除強名稱。是否有可能使用ILMerge內化Castle項目的DynamicProxy類?

顯然,DynamicProxy需要一些類是公共的正常工作。沒問題,我可以排除某些類型被ILMerge內化。但是,當我有一個引用我的庫的用戶時,還會引用Castle.Core.dll。公共類型現在由兩個程序集提供,並且對它們的引用不明確。

如果我不使用ILMerge Castle.Core.dll,航運它旁邊我自己組裝內化,這可能使我的版本,我的用戶的版本之間的版本衝突。如果我使用ILMerge內部化程序集,我不得不排除內部化DynamicProxy需要正常工作的類型。由於模糊的類型,此方法會破壞引用我的程序集和Castle.Core.dll的任何項目。

我是否被迫進入這兩個不理想的行動之一?還是有一些我還沒有想到的解決方案?

+0

你應該檢查出moq存儲庫。他們內部的Castle.Core for dynamicproxy也... https://github.com/Moq/moq4/tree/dev/Tools – cecilphillip 2013-03-03 02:15:29

+0

感謝您的指針,但我會指出項目正在使用舊版本的城堡項目,他們遭受同樣的問題。 – JimEvans 2013-03-03 04:56:20

+0

這是另一個辯論同一問題的項目。也許他們在這裏的討論可能會對你感興趣https://github.com/FakeItEasy/FakeItEasy/issues/16 – cecilphillip 2013-03-03 13:47:21

回答

0

當你有兩個完全合格的類型相同的名字,那麼你會遇到模棱兩可的問題。這可以使用extern alias解決。

默認情況下,所有引用的程序集屬於全球的別名,這就是爲什麼在生成的代碼,你會看到類似global::System.String內。我無法確定如何在ILMerge中使用extern別名,但可以使用它來消除引用的程序集歧義。無論哪種方式,你可以指定你的「內部」 Castle.Core.dll被別名爲沿「城堡」線的東西,並從中刪除全局別名。缺點是你必須修改你的代碼才能充分利用這個優勢,例如castle::Castle.Core.Interceptor.IInterceptor

這裏是一個很好的資源,可顯示您的詳細信息,包括圖像:http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts-part-2-extern-alias/


請記住,該二次基準Castle.Core.dll(由他人使用您的組件)可包含相同完全限定類型,但是對於所有帳戶,它們仍然是兩個明顯不同的類,即,通過從第二個程序集中傳入Castle.Core.Interceptor.IInterceptor類型,期望castle::Castle.Core.Interceptor.IInterceptor類型的方法不起作用。

相關問題