ILMerge отлично, если вы написали все сборки, которые вы пытаетесь объединить, и вы знаете, что ни одна из они делают предположения об организации сборки. Но при многих обстоятельствах (особенно в тех случаях, когда задействованы тяжелые размышления или динамический язык Runtime), ILMerge просто не работает. Иногда вещи случаются неожиданно и загадочно.
Когда ILMerge терпит неудачу, Джеффри Рихтер h a more reliable way to get applications with multiple DLL dependencies to be deployable as a single assembly.
С его подходом каждая сборка получает свое собственное имя, сильное имя и атрибуты, которые значительно улучшает ваши шансы на то, что полученное приложение просто работает.
Это не без компромиссов, но даже автор ILMerge Майк Барнетт в комментариях к сообщению в блоге «Как автор ILMerge, я думаю, что это фантастика! Если бы я знал об этом , Я бы никогда не написал ILMerge ».
Если вы можете использовать метод Рихтера, вы не будете путешествовать по большинству ловушек отражения или динамизма.
Реализации шаги
- Вставить все из сторонних сборок, которые вы зависите в ресурсах вашего приложения.
- Зарегистрировать
ResolveEventHandler
с событием AppDomain.CurrentDomain.AssemblyResolve
.
- Когда ваш обработчик вызывается с помощью сборки, которую вы спрятали в Ресурсах, загрузите сборку.
Вы делаете часть 3 следующим образом:
var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
return Assembly.Load(new BinaryReader(resourceStream).ReadBytes(int.MaxValue));
просто из любопытства, почему вы пытаетесь объединить DLL файлы? – Lloyd
К сожалению, наша команда Dev приняла решение пару лет назад в iLMerge большинству сторонних библиотек, которые мы используем, так как мы имеем в общей сложности около 50 проектов, которые должны ссылаться на эти DLL. Они считали, что было бы проще просто ссылаться на одну DLL в каждом проекте, а не ссылаться на каждую dll. Это решение, за которое мы все еще платим, так как оно давало мне головную боль каждый раз, когда мы сталкиваемся с проблемой. – PCG