iLMerge Enterprise Library 5.0

Кто-нибудь успешно iLMerged Enterprise Library 5.0? iLMerge успешно создает объединенную DLL, и мое приложение MVC компилируется, но при запуске приложения я получаю следующую ошибку:

SecurityTransparent and SecurityCritical attributes cannot 
be applied to the assembly scope at the same time.

2 ответа

Решение

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

В случае сбоя ILMerge Джеффри Рихтер стал более надежным способом развертывания приложений с несколькими зависимостями DLL в виде одной сборки.

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

Это не обходится без компромиссов, но даже автор ILMerge, Майк Барнетт, сказал в ветке комментариев к этому сообщению в блоге: "Как автор ILMerge, я думаю, что это фантастика! Если бы я знал об этом, я бы никогда не стал написал ILMerge."

Если вы можете использовать метод Рихтера, вы не сможете запутаться в большинстве ловушек отражения или динамизма.

Этапы реализации

  1. Внедрите все сторонние сборки, от которых вы зависите, в Ресурсы вашего приложения.
  2. Зарегистрировать ResolveEventHandler с AppDomain.CurrentDomain.AssemblyResolve событие.
  3. Когда ваш обработчик вызывается со сборкой, которую вы спрятали в Ресурсах, загрузите сборку.

Вы делаете часть 3 следующим образом:

var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));

Попробуйте объединить только библиотеки DLL, которые являются частью вашего приложения, а не фреймворки (System.Web.Mvc.dll, System.Web.Routing.dll и System.Web.Abstractions.dll).

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