Можно ли скомпилировать консольное приложение в один файл.dll?
Есть 5 консольных приложений, работающих на выходах друг друга и отдельно установленных на моем компьютере (C# 4.0, я автор) . Руководство хотело бы распространять этот набор приложений среди других пользователей, но не в восторге от того, чтобы просить неопытных пользователей установить / настроить 5 отдельных приложений. Есть ли способ, которым я могу скомпилировать каждую программу в.dll и ссылаться на них через одно главное приложение?
5 ответов
В. Основная проблема, кажется, в том, что вы не хотите 5 отдельных этапов установки?
A. Сделайте установщик для пакета:) Используйте любой компоновщик MSI (WiX, проекты установки Visual Studio, InstallShield и многие другие; черт возьми, вы даже можете сделать развертывание XCOPY в большинстве случаев)
В. Как я могу напрямую вызывать эти программы из одного процесса?
А. Варианты:
- Загрузите сборки в свой домен приложений.
- Используйте отдельный домен приложений в случае конфликтов имен (пробелов) или версий
Q. Как при желании "скрыть" присутствие внешних консольных приложений от просмотра
О. Посмотрите на ilmerge, чтобы возможно объединить "внешние" сборки, чтобы они больше не были видны. Если вы не можете использовать ilmerge (конфликты или, например, приложения WPF), вы можете встраивать их в качестве ресурсов и загружать их по требованию согласно пунктам 1. и 2. выше.
Обновление: https://libz.codeplex.com/ - это красивый проект, который облегчает эту задачу (сам не пробовал)
Тот факт, что каждый из них представляет собой отдельный файл.exe, не означает, что вы не можете рассматривать их как одно приложение. И они не должны быть установлены или настроены отдельно.
Но гораздо лучшим решением было бы переписать каждое из приложений, чтобы они представляли классы или интерфейсы, которые можно использовать без фактического запуска приложения. Таким образом, связь между частями будет намного проще.
В.Net единственная разница между.exe и.dll заключается в том, что вы можете запускать.exe напрямую. Но вы можете рассматривать обе библиотеки как библиотеки, поэтому вы можете использовать функциональность из одного.exe в другом.exe. Другим шагом может быть разделение ядра каждого приложения на.dll и заставить.exes просто иметь дело с вводом и выводом. При этом объединенное приложение не будет иметь весь код, который ему не нужен от других.
Это возможно, если каждая сборка использует разные имена классов. Просто включите весь исходный код при компиляции окончательной версии в одном проекте.
Идти к Project's
свойства, Application
и изменить OutputType
от Console
в Class Library
,
РЕДАКТИРОВАТЬ
Хотел бы выразить свои сомнения по поводу архитектурного решения, как это, поправьте меня, если я ошибаюсь в своих мыслях:
Полагаю, что разные EXE-приложения автономны, у вас есть разные приложения, которые работают standalone
,
Какое преимущество вы получаете, конвертируя их в DLL и соединяя их в одном главном приложении? Почему бы просто не использовать эти EXE-файлы с одним главным приложением и запускать их?
Таким образом, вы оставляете, как он уже работает + вы добавляете слой (главное приложение), так что для конечного пользователя все это похоже на одно приложение.
Это возможно - несколько вариантов:
- Вы помещаете функциональность каждого консольного приложения в отдельный класс в рамках одного проекта и имеете одно "главное приложение консоли", обеспечивающее их функциональность.
- вы помещаете функциональность каждого консольного приложения в отдельный класс, каждый в отдельном проекте с DLL в качестве цели, а затем ссылаетесь на эти библиотеки DLL по мере необходимости из своего "главного приложения консоли"
Примечание. Если вы идете по пути DLL, вы можете встроить библиотеки DLL в консольный EXE-файл, используя метод http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx
С обоими вариантами (все в одном EXE или EXE + встроенные DLL) вы можете просто выполнить развертывание XCOPY, если нет других зависимостей...