"Плохая двоичная подпись" в приложении 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. Так как в любом случае этого не должно быть в представлении, я переместил его в контроллер, и исключение исчезло.