Компилятор C # неправильно оптимизирует код - PullRequest
3 голосов
/ 24 сентября 2008

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

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

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

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

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

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

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

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

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

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

  2. Объединить сборку с ILMerge на другом компьютере.

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

Ответы [ 6 ]

7 голосов
/ 24 сентября 2008

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

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

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

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

1 голос
/ 24 сентября 2008

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

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

1 голос
/ 24 сентября 2008

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

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

1 голос
/ 24 сентября 2008

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

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

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

0 голосов
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

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

...