Можете ли вы связать DLL вместе? - PullRequest
7 голосов
/ 05 января 2010

У меня есть проект библиотеки классов, который я сделал. Давайте назовем это ClassA. В ClassA мне нужно получить доступ к некоторым инструментам, которые находятся в DLL (ToolsDLL.dll).

В ClassA я добавил ToolsDLL.dll в проект и выбрал файл ToolsDLL.dll для копирования в каталог ВСЕГДА. Так что библиотека прекрасно собирается и компилируется, и в выходном каталоге я вижу ClassA.dll вместе с ToolsDLL.dll

Далее я хочу написать приложение, скажем, App_A, которое использует методы в ClassA. Итак, в моем проекте App_A я добавил ссылку на ClassA.dll, чтобы получить доступ к его пространству имен. Все хорошо, это сборка / компиляция.

Проблема в том, что как только я запускаю App_A, и он доходит до точки, где необходимо использовать ToolsDLL.dll, он выдает исключение «Невозможно загрузить ToolsDLL.dll. Я не понимаю, как это возможно, что это может не найти эту DLL, потому что он находится в том же каталоге, что и ClassA.dll.

Я обнаружил, что если я поместил ToolsDLL.dll в выходной каталог App_A, он будет работать нормально. Есть ли способ обойти это? Есть ли способ, что ToolsDll.dll может быть как-то в комплекте с ClassA.dll. Причина в том, что мои клиенты будут писать свои собственные приложения, похожие на AppA, и было бы неплохо, если бы они ссылались только на один файл в своем проекте, а не на несколько.

Ответы [ 4 ]

12 голосов
/ 05 января 2010

Существует инструмент от Microsoft под названием ILMerge. Он, вероятно, будет делать то, что вы хотите, объединяя несколько сборок в один файл.

P.S. : Другое, довольно часто используемое решение вашей проблемы - добавить событие после сборки в решение / проект вашего приложения, которое скопирует требуемый ToolsDLL.dll в выходной каталог? Что-то вроде:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll

(Извините, если я что-то неправильно понял, я набираю это из своей памяти.)

Конечно, ваш клиент также должен был бы сделать это. Но, опять же, они, вероятно, сделали это раньше.

1 голос
/ 05 января 2010

Вы добавили DLL в проект, или вы действительно добавили ссылку на нее? Вы должны сделать последнее, тогда об этих вещах позаботятся автоматически для вас. Похоже, вы добавили фактический файл в файлы проекта и настроили его для копирования.

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

0 голосов
/ 05 января 2010

Вы можете использовать инструмент слияния IL или установить ToolsDLL.dll в GAC.

Также, если вы посмотрите на вывод App_A, ClassA.dll уже существует, вот где он ищет ToolsDLL.dll.

0 голосов
/ 05 января 2010

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

https://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

...