Объединение внешних библиотек .NET в один исполняемый файл

Это простой вопрос. Я просто не могу запустить свою программу, если Newtonsoft.Json.dll отсутствует в папке программы. Почему это? Я пытался добавить ссылку, добавил файл в корень проекта, добавил в папку ресурсов, но ничего не получилось. Как запустить программу без Newtonsoft.Json.dll в папке с программой? Я разрабатываю приложение Windows Form.

ОБНОВИТЬ

Проблема решена, спасибо spender за знакомство с ILMerge, действительно действительно хороший пакет NuGet, который может объединять сторонние DLL в один исполняемый двоичный файл. Для тех, кто хочет сделать отдельное приложение, просто используйте ILMerge. Быстро, легко и очень полезно. Увидимся!


person Hypister    schedule 30.08.2014    source источник
comment
В чем проблема с тем, что он находится в папке приложения? Вы хотели получить только один исполняемый файл и ничего больше?   -  person spender    schedule 30.08.2014
comment
Да, отдельное приложение   -  person Hypister    schedule 30.08.2014
comment
Лично мой любимый инструмент для встраивания зависимостей проекта — Fody Costura. Он имеет минимальную настройку и интегрируется в сборку. Он сжимает и упаковывает зависимости (управляемые, неуправляемые и смешанные сторонние сборки, а также выходные данные вашего собственного проекта) в виде встроенных ресурсов, позволяющих развертывать в одном файле, если вы правильно разыграете свои карты. github.com/Fody/Costura#readme   -  person Kirill Shlenskiy    schedule 01.09.2014


Ответы (3)


Обычно, если ваша программа использует DLL, вам понадобится эта DLL в папке приложения (или в пути пользователя, или в GAC).

Обычный метод распространения нескольких файлов — с помощью установщика. Вы можете написать его, используя либо WiX, либо Проекты установщика VS. Теперь все ваши выходные файлы устанавливаются за один раз вместе со всеми остальными преимуществами, которые поставляются с установленной программой. Я отдаю предпочтение этому методу.

Однако есть альтернативы:

  • Загрузите исходный код и скопируйте исходный код в свой основной проект, после чего он будет скомпилирован в вашу основную сборку. (убедитесь, что вы проверили, что это разрешено лицензией).

  • Используйте ILMerge, чтобы объединить все ваши сборки в один двоичный файл.

person spender    schedule 30.08.2014
comment
@Hypister: Пожалуйста, рассмотрите изменение названия, которое меньше связано с JSON.NET и больше связано с распространением приложений .net с внешними библиотеками DLL. - person spender; 31.08.2014

Если вы не хотите ссылаться на dll в своей программе, вы можете установить ее в GAC на клиентской машине, но я не понимаю, какой контекст вы хотите

person tungnt185    schedule 30.08.2014
comment
Я просто хотел бы запустить программу как автономную. С скомпилированной с ним dll. - person Hypister; 30.08.2014

Если вам просто нужна сериализация JSON. Можете ли вы отключить свою функциональность с помощью класса JavascriptSerializer, который устанавливается вместе с .Net?

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.90).aspx

person Steve Danner    schedule 30.08.2014
comment
Это было бы очень полезно, но мне нужно использовать JSON. - person Hypister; 30.08.2014
comment
это то, что делает JavascriptSerializer... создает и читает JSON. Я вижу, у вас есть решение с использованием ILMerge, который является отличным инструментом, но вы можете попробовать его, чтобы избежать дополнительной сложности сборки и придерживаться библиотек базовых классов. Однако трудно сделать, когда у вас есть рабочее решение :) - person Steve Danner; 01.09.2014
comment
Спасибо, но рано или поздно мне понадобится этот инструмент. И когда я начал использовать JavascriptSerializer, у меня не было нужных ссылок, поэтому я сдался и выбрал ILMerge. - person Hypister; 01.09.2014