"Плохая двоичная подпись" в приложении ASP.NET MVC

Я столкнулся с той же проблемой, о которой сообщалось здесь: "Плохая двоичная подпись" в приложении ASP.NET MVC

Сайт ASP.Net MVC отлично работает на локальном компьютере, но при развертывании с использованием комбинации aspnet_compiler, aspnet_merge и msdeploy загрузка любой страницы завершится ошибкой:

System.BadImageFormatException Неверная двоичная подпись. (Исключение из HRESULT: 0x80131192)

Принятое решение в связанном вопросе предполагает, что проблема вызвана использованием неверной версии aspnet_merge, и я убедился, что удаление шага aspnet_merge из развертывания решает проблему.

Моя проблема в том, что использование правильной версии aspnet_merge не позволяет решить проблему.

Веб-приложение ориентировано на 64-разрядную версию.Net 4.0. Используемый путь aspnet_merge: "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin \ NETFX 4.0 Tools \ aspnet_merge.exe"

[РЕДАКТИРОВАТЬ]

Местный разработчик:

  • VS2010 SP1
  • Кассини
  • x64
  • VS11 Beta и.Net 4.5 установлены

Пути сборки:

  • C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \
  • C: \ Program Files (x86) \ IIS \ Microsoft Web Deploy V2 \

2 ответа

Я также сталкивался с подобной проблемой при использовании проекта веб-развертывания для предварительной компиляции проекта веб-сайта ASP.NET в VS2010 (.NET 4.0).

Все работало нормально, пока я не установил VS2012 (который устанавливает.NET 4.5 - я предполагаю, что это связано), который начал давать мне:

System.BadImageFormatException: Bad binary signature. (Exception from HRESULT: 0x80131192)

После некоторой отладки и отдельных тестовых случаев я отследил проблему до лямбды, передаваемой между веб-сайтом.NET 4.0 и другим проектом.NET 3.5.

Метод, определенный в проекте 3.5, имеет такую ​​подпись:

public IEnumberable<T> ExecuteAsEnumerable(Func<IDataReader, T> func)
{
  //..
}

который использовался на веб-сайте 4.0 в получателе свойств, что приводило к ошибке при объединении через aspnet_merge:

public IList<MyObject> MyListOfItems
{
  get
  { 
    return _myListOfItems ?? (_myListOfItems = new SomeQueryBuilder()
      //.build statement
      .ExecuteAsEnumerable(reader => new MyObject(reader))
      .ToArray());
  }
}

В моем тестовом случае я воссоздал ExecuteAsEnumerable как другой названный метод расширения внутри веб-сайта 4.0, предварительно скомпилированный, и он работал. После проверки "Target .NET Framework" проекта и понимания, что он равен 3,5 (я раньше этого не понимал), я переключил все на 4.0, и все снова заработало.

Что-то явно изменилось в обновлении.NET 4.5 (которое было обновлением до версии 4.0). В моем случае я мог бы перекомпилировать рассматриваемый проект - я не уверен, что у всех будет такая роскошь (это правильное слово?).

Надеюсь, это поможет.

Я также столкнулся с этим исключением. Насколько я могу судить, это не была проблема с версией aspnet_merge или проблема с целевой платформой. Это однако на более старом проекте, недавно обновленном к MVC 5.

У меня был этот код в представлении Razor:

var companies = users.Select(u => u.Company).DistinctBy(c => c.Id)
                             .OrderBy(c => c.Id == CurrentUser.Company.Id ? 0 : 1)
                             .ThenBy(c => c.Name);

Он использует Linq и DistinctBy для библиотеки MoreLinq. Так как в любом случае этого не должно быть в представлении, я переместил его в контроллер, и исключение исчезло.

Другие вопросы по тегам