2013-09-27 61 views
0

假設我需要部署一個程序集(Requirement)。我將使用ILMerge合併所有程序集。但是我的很多程序集都有PreApplicationStartMethodAttribute(我沒有對所有這些程序集進行任何控制)。 ILMerge將創建一個程序集,並且PreApplicationStartMethodAttribute只能在程序集中使用一次。我該怎麼辦?System.Web.PreApplicationStartMethodAttribute和ILMerge

+0

你可以像所有的程序集一樣做ZIP嗎?然後創建一個包含ZIP文件作爲資源的包裝程序集,以及從ZIP文件中提取其他程序集的代碼? –

+0

@JohnSaunders,我不明白? – user960567

+0

@ user960567實際上,John Saunders所說的是「不要創建單個程序集,保留多個程序集,但將它們隱藏在一個文件中」。這可能會或可能不會滿足您的要求。 – hvd

回答

2

(從評論)

在.NET 4.0,PreApplicationStartMethod只能使用一次每組件指定:

PreApplicationStartMethodAttribute Class

[AttributeUsageAttribute(AttributeTargets.Assembly, AllowMultiple = false)] 
public sealed class PreApplicationStartMethodAttribute : Attribute 

但在.NET 4.5,多發性單個組件中的屬性都可以:

PreApplicationStartMethodAttribute Class

[AttributeUsageAttribute(AttributeTargets.Assembly, AllowMultiple = true)] 
public sealed class PreApplicationStartMethodAttribute : Attribute 

,因此您可以通過升級到.NET 4.5避免此問題。

+0

我想知道是什麼讓CLR團隊在定義了多個這樣的屬性的情況下使用此限制來實現它:'不能保證程序集定義的應用程序啓動方法被調用的順序。因此,每個已註冊的開始方法應該編碼爲獨立運行,並且不應該依賴於其他已註冊開始方法的副作用。爲什麼他們不能保證執行的順序是在assemblyinfo.cs文件中定義的? – RBT

+0

@RasikBihariTiwari假設當檢索屬性時,即使它們是在同一個源文件中定義的,也可以用源代碼順序檢索它們。 [沒有要求。](http://stackoverflow.com/a/480079)你也假設他們都在AssemblyInfo.cs文件中定義。沒有要求:他們可以在單獨的文件中定義,其中沒有訂單比其他任何訂單更明智。 – hvd

+0

我完全錯過了這種情況,可以在應用程序域中加載的各種程序集中的多個AssemblyInfo.cs文件中提及此屬性。我一直在想,我通常只在我的啓動項目中使用這個屬性來初始化DI容器中的服務註冊等。同意你的意見。感謝您的快速響應! – RBT