компилятора C# Некорректно Оптимизирует код


3

У меня есть приложение ASP.NET работает на удаленном веб-сервере, и я только начал получать эту ошибку:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'. 

Я разобрали код в DLL, и кажется, что компилятор неправильная оптимизация кода. (Обратите внимание, что набор является класс, который реализует набор уникальных объектов Он наследует от IEnumerable.). Эта строка:

Set<int> set = new Set<int>(); 

компилируется в этой строке:

Set<int> set = (Set<int>) new ICollection<CalendarModule>(); 

Класс CalendarModule является полностью несвязанный класс !! Кто-нибудь когда-либо замечал .NET некорректно компилировать такой код раньше?

Обновление # 1: Эта проблема, кажется, представлена ​​инструментом Microsoft ILMerge. В настоящее время мы изучаем, как его преодолеть.

Обновление № 2: Мы обнаружили два пути решения этой проблемы. Мы не совсем понимаем, в чем заключается основная проблема, но оба они исправить:

  1. Отключить оптимизацию.

  2. Объедините сборку с ILMerge на другой машине.

Так мы остались интересно, если сборка машина неправильно настроена как-то (что странно, учитывая, что мы использовали машину, чтобы построить релизы более года) или, если это какая-то другая проблема.

  0

Недостаточно кода для отладки вашей проблемы. Не могли бы вы загрузить достаточно своего кода, чтобы воспроизвести проблему где-нибудь? 23 сен. 082008-09-23 20:16:30

+2

Разве вы не знаете, что Int наследует от CalenderModule? :) 23 сен. 082008-09-23 21:43:21

7

Ahh, ILMerge - эта дополнительная информация в вашем вопросе действительно помогает с вашей проблемой. В то время как я никогда не ожидал, что компилятор .NET будет терпеть неудачу таким образом, я ожидал бы иногда видеть подобные вещи с помощью ILMerge (учитывая то, что он делает).

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

Вы подняли ошибку с Microsoft?

Обходным решением в то же время является перекомпилирование сборок из источника как единой сборки, что избавляет от необходимости использования ILMerge. Поскольку файлы csproj представляют собой только XML-списки, они в основном легко объединяются, и вы можете автоматизировать это как дополнительный шаг MSBuild.

  0

Слияние файлов .csproj - хорошая идея, мы можем попробовать это. 24 сен. 082008-09-24 17:14:03

  0

Есть ли у кого-нибудь хорошие ресурсы, как скомпилировать несколько сборок как один с помощью компилятора cs/vb без ILMerge? 02 окт. 082008-10-02 03:51:03

  0

@Lamar: Я уже ответил на этот вопрос раньше. См. Http://stackoverflow.com/questions/1878807/vs2008-creating-single-dll-from-solution-with-many-projects/1879281#1879281 12 дек. 092009-12-12 00:36:27


1

Вы уверены, что сборка, на которую вы смотрите, была создана с учетом исходного кода? Можете ли вы воспроизвести эту проблему с помощью небольшого теста?

Редактировать: Если вы используете рефлектор, возможно, что преобразование MSIL в C# неверно. Отражатель не всегда на 100% точнее при декомпиляции. Как выглядит MSIL?

Редактировать 2: Хм ... Я просто понял, что это не может быть рефлектор по вине или вы не получили бы это сообщение об ошибке во время выполнения.

  0

Я пока не смог воспроизвести проблему с меньшим тестовым образцом. В этом случае разборка кажется правильной. Об этом свидетельствует ошибка, с которой я ссылаюсь на конструктор ICollection. 23 сен. 082008-09-23 20:15:34

  0

Скомпилирует ли без оптимизации оптимизацию? 23 сен. 082008-09-23 20:45:38


0

Был ли код, недавно развернутый на этом сервере? Может кто-то толкнул сборку без вашего ведома? Можете ли вы перейти к исходному контролю, вытащить последнее и дублировать проблему?

На данный момент, с данной информацией, я сомневаюсь, что это компилятор.


1

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

Код, найденный в вашем инструменте отражения, скорее всего, приведет к исключению типа typecast.

  0

В коде отсутствует сериализация. 23 сен. 082008-09-23 20:25:51

  0

Хорошо, но для исключения будет нужен следующий код: new ICollection <yourType>() 23 сен. 082008-09-23 20:32:28


1

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

Sidenote: Я также хотел бы указать System.Collections.Generic.HashSet<T>, который находится в .Net fx 3.5 и делает именно то, что должен класс Set<>.

  0

Я определенно согласен с «мыслью не сломленной» школой мысли, и ошибка, вероятно, на самом деле не вызвана плохим компилятором, просто что делает его похожим на плохую оптимизацию. Спасибо за отзыв о HashSet <T>, к сожалению, мы еще не на 3.5, все еще на 2.0. 23 сен. 082008-09-23 20:24:23


0

Ouch. Если это действительно ошибка ILMerge, пожалуйста, держите эту тему в курсе последних событий - я использую ILMerge как ключевой шаг в построении сборки COM-взаимодействия.

  0

Я дам вам знать, что мы найдем. 23 сен. 082008-09-23 21:35:23