2013-12-23 2 views
1

У меня есть .NET-решение, которое я пишу, что конечным результатом является библиотека классов (я должен предоставить клиенту DLL-файл, который он мог бы ссылаться и использовать в своем проекте).Библиотека классов как встроенный ресурс - это можно сделать?

Мое решение включает в себя:

  • Библиотека классов (назовем его MyClassLib) - это фактическая библиотека классов, что я должен дать клиенту
  • Инструменты библиотеки классов - это библиотека классов содержит инструменты, которые не являются частью фактического MyClassLib но используются внутри него (и для этого ссылочные ею)
  • Console Application
  • - для тестирования MyClassLib (usless для клиента)

Когда я публикую, как и ожидалось, я получаю файлы DLL - один для MyClassLib и один для инструментов.

Я хочу дать клиенту только один DLL-файл (MyClassLib) и что DLL будет знать, как использовать Инструменты, даже если он не копируется с ним.

Мне было интересно, есть ли способ встроить ссылку Tools в MyClassLib. Если да, то как? если нет, что бы вы сделали в таком случае?

Благодаря

+2

Для этого вы можете использовать [ILMerge] (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx). –

ответ

0

Я имел удивительные результаты с LibZ. Вы можете просто объединить все вместе. Я использовал его для слияния всего с установщиком .exe, но он также работает и с .dll.

3

This post от Jeffrey Richter показывает вам, как это сделать.

В основном вы используете событие AppDomain.CurrentDomain.AssemblyResolve, чтобы перехватить сборку и вернуть сборку из ресурса.

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

+0

Использование подхода AssemblyResolve в lib/dll может быть неприятным для конечного пользователя. ILMerge или [ILRepack] (https://github.com/gluck/il-repack) обычно лучше подходят. – Gluck

+0

@Gluck - что делает AssenblyResolve неприятным для конечного пользователя? – Nir

+0

AssemblyRes является глобальным для AppDomain, статически init во время выполнения, будет вызван для ошибки * для каждого типа *, не может быть отключен/приоритет. Также недоступность для компиляции env (например, VS может жаловаться на то, что она не находит библиотеки зависимостей, когда вы ссылаетесь на таковую с таким «resolver») – Gluck

3

Старый, но будет опубликован для будущих искателей.

Построить класс следующим образом:

class Extractor 
{ 
    public static void ExtractResourceToFile(string resourceName, string filename) 
    { 
     if (!System.IO.File.Exists(filename)) 
      using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) 
      using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create)) 
      { 
       byte[] b = new byte[s.Length]; 
       s.Read(b, 0, b.Length); 
       fs.Write(b, 0, b.Length); 
      } 
    } 
} 

Затем добавьте

Extractor.ExtractResourceToFile("NAMESPACE.YOURDLL.dll", "YOURDLL.dll"); 

в основной файл.

Для того, чтобы это работало, просто Добавить в существующий файл с сборки действия внедренного ресурса.

Работает с любыми DLL-файлами третьих лиц, и вы можете, конечно, использовать как dll-импорт, так и ссылку.

+0

Очень приятно. Это определенно даст это. – crunchy

Смежные вопросы