2008-09-23 3 views
3

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

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

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

+2

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

ответ

7

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

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

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

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

1

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

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

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

+0

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

+0

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

0

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

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

1

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

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

+0

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

+0

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

1

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

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

0

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