.NET 4.x Как грамотно использовать много библиотек - C#
Формулировка задачи:
Добрый вечер. Перейду сразу к делу: имеется некое приложение, которое использует элементы управления Telerik. Те, кто сталкивался с Telerik, знает, что для обеспечения переносимости приложения (то есть возможности его запускать на компьютерах где нет telerik'а) он выгружает при сборке проекта целую кучу dll файлов. В моем случае их порядка 40 штук.
Моя цель - совместить все эти библиотеки в единый dll файл, которым сможет пользоваться приложение.
Я несколько часов пытался сделать это через программу ILMerge, а так же его собрата ILMerge GUI. Ничего не вышло. Постоянно появляются те или иные ошибки (типа одинаковых типов, ключей, словарей и прочее прочее). Ничего не вышло.
И тут в поисках я наткнулся на интересный способ совмещения библиотек в проекте (источник http://www.telerik.com/blogs/how-to-...pf-application). Благодаря MSBuild таску получается практически то, что нужно - все библиотеки включаются в исполняемый файл. Однако это не совсем то, чего хочу я. Я попытался сделать то же самое с проектом-библиотекой. Получил на выхлопе жирненький dll файл (как и должно быть). Но я не могу получить доступ к вложенным в него библиотекам Telerik'а. Подскажите пожалуйста, как можно решить мою проблему.
Решение задачи: «.NET 4.x Как грамотно использовать много библиотек»
textual
Листинг программы
public App()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve;
this.InitializeComponent();
}
private Assembly CurrentDomainOnAssemblyResolve(object sender, ResolveEventArgs args)
{
var assFileName = new AssemblyName(args.Name).Name + ".dll";
var ass = Assembly.LoadFrom("ИМЯ_БИБЛИОТЕКИ.dll"); //Здесь указать то, что на выходе из проекта библиотек
if (ass.GetManifestResourceNames().Contains(assFileName))
{
using (var stream = ass.GetManifestResourceStream(assFileName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
return null; //Ошибка
}