2015-03-08 5 views
1

Использование C# в visual studio 2012, я создал библиотеку классов FileTube.dll Он использует 3 других dll's. Я хочу создать отдельную dll, чтобы содержать их, поэтому я могу публиковать свою библиотеку через nuget. Я попытался 3 подхода все неудовлетворительный:Как слить dll в одну dll

подхода 1: В vistual студии, я поставил "Вставить Interop ассамблею" к истинному, я получаю эту ошибку:

Error 2 Cannot embed interop types from assembly 'DiffieHellman.dll' because it is missing the 'GuidAttribute' attribute DiffieHellman.dll 

подхода 2: Я использовал ILMergeGUI. Он сгенерировал код для использования в ILMerge, который не работает с ошибкой: Ссылка на объект не установлена ​​в экземпляр объекта. Вот команда:

"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" 
/ndebug 
/copyattrs 
/targetplatform:4.0,"C:\Windows\Microsoft.NET\Framework64\v4.0.30319" 
/out:"C:\temp\z.dll" 
"C:\\FileTube\TestApp\bin\Debug\FileTube.dll" 
"C:\\FileTube\TestApp\bin\Debug\DiffieHellman.dll" 
"C:\\FileTube\TestApp\bin\Debug\Org.Mentalis.Security.dll" 
"C:\\FileTube\TestApp\bin\Debug\Tamir.SharpSSH.dll" 

подход 3: Я следовал за этим tutorial использовать отражение, чтобы включить DLL сборки. Разница заключается в том, что учебник имеет основной исполняемый файл и включает DLL в исполняемый файл, в то время как я пытаюсь включить DLL в свою DLL. поэтому я добавил код отражения в конструктор класса моей основной dll. Он компилируется, но это не сработает, если я переименую эту внешнюю dll, что означает, что она не загружает ее.

Любые идеи?

+3

Идея состоит в том, чтобы иметь пакет nuget, который ссылается на другой пакет nuget. Пусть nuget разрешает ссылки, а не пытается перехитрить их. –

+1

Вам нужно будет получить команду ILMerge. Недостаточно панировок, но будьте осторожны, что вы это делаете [опасно неправильно] (http://stackoverflow.com/a/13750130/17034). –

+0

Почему вы объединяете библиотеки DLL в одну DLL. Просто объедините их в исполняемый файл. Я думаю, что ILMerge ожидает, что выход будет exe, а не DLL. Также удалите двойную обратную косую черту в путях, ее тонкость и не справляется с хорошей обработкой исключений. Например, текущая версия ILMerge будет вызывать ту же ошибку, если вы укажете ей пути, в которых есть пробелы. (Кстати, я сливаю тот самый тамир.sharpSS.dll в моем исполняемом файле и ILMerge работает безупречно. Но я объединять его в исполняемый файл (.exe), а не другую DLL. – Hashman

ответ

3

У вас есть несколько вариантов:

  • использование ILMerge (бесплатно)
    Для HOWTO см here и here

ИЛИ

  • использовать какой-то инструмент, как SmartAssembly (коммерческий)
    он может вставлять и меня РГП среди других вещей (нет необходимости менять исходный код)

ИЛИ

  • code that yourself in less than 10 lines (бесплатно, но минимальное изменение исходного кода)
    пометить все необходимые зависимости, как «внедренного ресурс», - таким образом, они включены в файл EXE ... вам нужно настроить в AssemblyResolve обработчик, который во время выполнения считывает из ресурсов и возвращает необходимые библиотеки DLL для .NET выполнения ...

(Ответ скопированный с: How to merge multiple assemblies into one?)

+1

Третий вариант работает только для exe но не для dll. –

+1

Исправить. Спасибо за добавление :) –

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