ILMerge объединяет сборки, что приятно, но иногда не совсем так, как вы хотите. Например, когда рассматриваемая сборка является сборкой со строгим именем, и у вас нет ключа для нее, вы не сможете выполнить ILMerge, не сломав эту подпись. Это означает, что вам нужно развернуть несколько сборок.
В качестве альтернативы ilmerge, вы можете встроить одну или несколько сборок в качестве ресурсов в ваш exe или DLL. Затем во время выполнения, когда загружаются сборки, вы можете программно извлечь встроенную сборку, загрузить и запустить ее. Звучит сложно, но есть только небольшой пример кода.
Чтобы сделать это, вставьте сборку так же, как и любой другой ресурс (изображение, файл перевода, данные и т. Д.). Затем установите AssemblyResolver, который вызывается во время выполнения. Это должно быть установлено в статическом конструкторе класса запуска. Код очень прост.
static NameOfStartupClassHere()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
}
static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
{
Assembly a1 = Assembly.GetExecutingAssembly();
Stream s = a1.GetManifestResourceStream(args.Name);
byte[] block = new byte[s.Length];
s.Read(block, 0, block.Length);
Assembly a2 = Assembly.Load(block);
return a2;
}
Свойство Name в параметре ResolveEventArgs - это имя сборки, которую необходимо разрешить. Это имя относится к ресурсу, а не к имени файла. Если вы встраиваете файл с именем «MyAssembly.dll» и называете встроенный ресурс «Foo», то здесь вам нужно имя «Foo». Но это может сбить с толку, поэтому я предлагаю использовать имя файла сборки для имени ресурса. Если вы правильно внедрили и назвали свою сборку, вы можете просто вызвать GetManifestResourceStream () с именем сборки и загрузить сборку таким образом. Очень просто.
Это работает с несколькими сборками, так же хорошо, как с одной встроенной сборкой.
В реальном приложении вы захотите улучшить обработку ошибок в этой подпрограмме - например, что если нет потока с данным именем? Что произойдет, если чтение не удастся? и т. д. Но вам остается это сделать.
В остальной части кода приложения вы используете типы из сборки как обычно.
Когда вы собираете приложение, вам нужно добавить ссылку на соответствующую сборку, как вы это обычно делаете. Если вы используете инструменты командной строки, используйте параметр / r в csc.exe; если вы используете Visual Studio, вам потребуется «Добавить ссылку ...» во всплывающем меню проекта.
Во время выполнения проверка и проверка версии сборки работает как обычно.
Разница только в распределении. Когда вы развертываете или распространяете свое приложение, вам не нужно распространять DLL для встроенной (и ссылочной) сборки. Просто разверните основную сборку; нет необходимости распространять другие сборки, потому что они встроены в основную DLL или EXE.