2012-06-26 3 views
4

Что определяет порядок занятий в сборке?Порядок занятий в сборе

И .. есть ли способ изменить его?


Дополнительная информация: Вы можете проверить упорядочении либо через отражение себя, или вы можете использовать такой инструмент, как ILDASM, отключить алфавитной сортировки, а затем вы получите заказ.

Порядок, кажется, странным образом определяется компилятором.

Я уже пробовал некоторые вещи .. как переименование классов (порядок остается прежним), также редактируя файл .csproj, чтобы изменить порядок файлов .cs.

Основное внимание уделяется VS2008, C#, .net 3.5.


Обновления: У меня есть сценарий, где вопросам порядка (внешняя программа проходит через мою сборку посредством отражения) - и мне нужен специальный порядок там. Кроме этого - вы совершенно правы - заказ действительно не должен иметь значения.

+0

Есть ли что-то, что вы пытаетесь решить или обойти или это просто ради любопытства. то есть какое это имеет значение? –

+4

По совпадению, я считаю, что @EricLippert просто написал [сообщение в блоге, которое связано с этим] (http://blogs.msdn.com/b/ericlippert/archive/2012/05/31/past-performance-is-no-guarantee -of-будущего-results.aspx). –

+0

Зачем вам это нужно? – VVS

ответ

3

Я собираюсь высунуть шею здесь и сказать, что это деталь реализации и вполне может быть решена любым конкретным компилятором.

Поскольку это деталь реализации, которую вам не нужно или не нужно беспокоить. Конечно, если это действительно важно (не могу понять, почему), вы всегда можете написать свой собственный IL.

Я оставляю вас со следующей цитатой из Eric's blog:

компилирует тот же C# программы дважды гарантированно производить тот же двоичный выход?

No.

+0

Thx, запись в блоге Эрика довольно интересна. Это мало объясняет. Кроме того, если вы посмотрите на комментарий, я бы сказал, что около четверти имели такую ​​же проблему хотя бы один раз. :) Некоторые из них действительно должны были перейти к конкретным компиляторам/языкам для этого требования (нет, а не мне!). О, и ... Я действительно не вижу, чтобы точка компиляции была недетерминированной. Я имею в виду, что могут быть алгоритмы оптимизации, связанные с случайной частью, но .. хм .. Я бы скорее сомневался, что это так. Он также только утверждает, что выход изначально отличается главным образом из-за генерируемых GUID и тому подобного. –

+0

Компиляторы могут быть недетерминированными. Напр. компилятор может использовать несколько потоков для компиляции типов (или классов) в сборке после цикла логики разрешения зависимостей типа. Когда и когда поток завершает компиляцию типа, компилятор может добавить запись для этого типа в метаданные. Поскольку планирование потоков не является детерминированным, порядок записей метаданных и, следовательно, порядок классов в сборке становятся недетерминированными. Я не говорю, что на самом деле все работает, но легко понять, что компилятор вполне может быть недетерминированным. –

2

Что определяет порядок занятий в рамках Ассамблеи?

Компилятор.

И .. есть ли способ его изменить?

Напишите свой собственный IL напрямую.


Это, как говорится, порядок типов внутри сборки действительно не имеет значения. Вы можете использовать эти типы, независимо от их порядка.

1

Так как я не работаю с этим в годы я пытаюсь вспомнить об этом, насколько я могу, однако большинство это то, что я помню из чтения «Эксперт .NET 2.0 Il Ассемблер «Серж Линдин и писать мои собственные дизассемблеры. Таким образом, FWIW:

Перед миром управляемого кода, т.е. Java или .NET, компоновка кода и данных была более требовательной из-за использования загрузчиков, которые накладывали код и данные в виде необработанных байтов из хранилища прямо в память ,С появлением управляемых сред появился дополнительный слой, который мог читать память, а затем просматривать его не как данные, которые должны отображаться в память, так и в виде графика данных с метаданными. Таким образом, метаданные могут использоваться для компоновки кода и данных в память. Выполнение быстрого сканирования ответа в книге, единственное, что я мог найти, было в разделе «Порядок манифестных деклараций в ILAsm» стр. 112. «Общее правило в ILAsm (и не только в ILAsm)« объявляет, а затем ссылается ».« Поэтому некоторые из метаданных имеют правила упорядочения, но поскольку метаданные содержат ссылки на фактический код и данные на хранении , только метаданные имеют определенный порядок, и код и данные, которые мы используем для выполнения определенного порядка, теперь могут быть неупорядочены. Опять FWIW. Если бы вы спросили меня несколько лет назад, я, вероятно, мог бы написать вам целую бумагу.

+0

Позор Я слишком поздно. :) Спасибо в любом случае за понимание! –

Смежные вопросы