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."
Если вы можете использовать метод Рихтера, вы не сможете запутаться в большинстве ловушек отражения или динамизма.
Этапы реализации
- Внедрите все сторонние сборки, от которых вы зависите, в Ресурсы вашего приложения.
- Зарегистрировать
ResolveEventHandler
сAppDomain.CurrentDomain.AssemblyResolve
событие. - Когда ваш обработчик вызывается со сборкой, которую вы спрятали в Ресурсах, загрузите сборку.
Вы делаете часть 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).