簡體   English   中英

程序集中的類順序

[英]Order of Classes within an Assembly

什么決定了程序集中類的順序?

而且..有辦法改變它嗎?


附加信息:您可以自己通過反射檢查排序,也可以使用ILDASM之類的工具,禁用字母排序,然后您也將獲得順序。

順序似乎是由編譯器以一種奇怪的方式確定的。

我已經嘗試了一些事情......比如重命名類(順序保持不變),還編輯 .csproj 文件以更改 .cs 文件的順序。

我的主要關注點是 VS2008、C#、.net 3.5。


更新:我確實有一個訂單很重要的場景(外部程序通過反射通過我的程序集) - 我需要在那里特殊訂單。 除此之外 - 你是完全正確的 - 訂單真的不重要。

我要在這里說我的意思,這是一個實現細節 ,很可能由任何特定的編譯器決定。

由於這是一個實現細節,因此您不必擔心或不必擔心。 當然,如果這真的很重要(看不明白為什么),則可以隨時編寫自己的IL。

我為您提供了Eric博客中的以下引文:

是否可以兩次編譯同一C#程序以保證產生相同的二進制輸出?

沒有。

什么決定裝配中的類順序?

編譯器。

並且..有辦法改變它嗎?

直接編寫自己的IL。


話雖如此,程序集內類型的順序實際上並不重要。 您可以使用類型而不必考慮其順序。

由於多年來我一直沒有使用此工具,所以我將盡我最大的努力來回憶起這個問題,但是,通過閱讀Serge Lindin的“ Expert .NET 2.0 Il Assembler”並編寫自己的反匯編程序,我可以回想起其中的大部分內容。 所以FWIW:

在使用托管代碼(例如Java或.NET)之前,由於使用了將代碼和數據作為原始字節從存儲權直接存儲到內存的加載程序,因此代碼和數據的布局更加嚴格。 隨着托管環境的到來,增加了一個層,該層可以讀取存儲,然后通過帶有元數據的數據圖將其視為不映射到內存的數據。 這樣,元數據可用於將代碼和數據布局到內存中。 快速搜索本書中的答案,我唯一能發現的要點是在“ ILAsm中的清單聲明順序”頁下。 112.“ ILAsm中的通用規則(不僅是ILAsm中的通用規則是“先聲明,然后引用”。)”因此,某些元數據具有有關排序的規則,但是由於元數據保留了對實際代碼和存儲數據的引用,只有元數據具有特定順序,而我們習慣於具有特定順序的代碼和數據現在可以無順序。 再次FWIW。 如果您幾年前問過我,我可能可以為您寫整篇論文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM