Плюсы и минусы использования существующей сборки .NET по сравнению с инструментом командной строки для той же цели
Я искал Интернет, и я не могу найти ничего, что связано с этой темой. Я бы подумал, что в этом было бы некоторое обсуждение. Я просто не могу его найти.
В принципе, то, что я ищу, является веским основанием для использования существующей сборки .NET, чтобы сделать то же самое, что и предыдущий исполняемый файл командной строки. Поэтому, если бы я использовал сборку, я бы включил ее и начал использовать ее в своем коде на С#. Для нас старый инструмент командной строки, я бы сделал Process.Start(...)
и т.д.
Справочная информация по этому вопросу:
У меня есть требование выполнить шифрование и дешифрование PGP для файлов, переданных в нашу систему и из нее. Мои текущие параметры - использовать инструмент командной строки командной строки (http://www.gnupg.org/) или сборку Bouncy Castle.NET.
Меня спросили, почему я не просто "автоматизирую" старый инструмент командной строки GPG в своем коде. Я хотел бы ответить на этот вопрос с некоторым умом. Сейчас я могу думать только о двух причинах:
-
Обработка ошибок: я должен иметь возможность не только получать более эффективную информацию об ошибках, используя сборку .NET, но лучше обрабатывать их с помощью try/catch с исключениями и т.д. Я мог бы даже свернуть свои собственные исключения по мере необходимости, и др.
-
Переносимость кода: все, что я собираю с помощью сборки .NET, более или менее автономно. Мне не нужно находить и копировать исполняемый файл GPG для каждого места. Я копирую приложение (ы), которое я пишу, используя его.
-
Производительность: возможно. У меня нет опыта или данных относительно этого.
Буду признателен за любые материалы по этой теме.
Ответы
Ответ 1
Честно говоря, я пошел бы с сборкой .NET, поскольку это, кажется, более простое решение и более жесткое решение, чем запуск нового процесса. Некоторые из причин, по которым я так чувствую, следующие:
- С помощью инструмента командной строки вы запускаете новый процесс. Таким образом, он запускает полностью отдельный идентификатор процесса и запускается за пределами области действия и области приложения существующего приложения. Вся связь между вашим приложением и процессом будет проходить через границы процесса и должна выполняться либо с помощью вызова службы, либо с помощью некоторой общей памяти, либо с помощью какого-либо другого подхода, который может быть громоздким (особенно при решении проблем).
- При запуске нового процесса вы в основном теряете контроль над этим процессом из своего приложения. Если ваше приложение умирает или выключается, вам придется явно убить этот процесс, иначе у вас могут быть открытые ключи, заблокированные файлы и т.д.
- Включение сборки .NET в ваше приложение позволяет запускать все в одном и том же контексте (обычно), что обеспечивает лучшую связь между компонентами, упрощает отладку и устранение неполадок (обычно) и управляется одним процессом.
- У вас есть немного больше контроля над вашим кодом. Запуск процесса - это, в основном, черный ящик - вы не представляете, что происходит внутри него. Конечно, с сборкой .NET у вас также есть похожий сценарий с черным ящиком, но поскольку он находится в том же процессе, у вас может быть некоторое представление о том, как выполняются вызовы, где выбрасываются исключения и т.д. В принципе, вы имеют немного больше информации о компоненте с сборкой .NET, а не запускают новый процесс.
Это лишь некоторые мысли с головы. Надеюсь, это поможет. Если у вас есть вопросы, сообщите мне, и я уточню свои ответы. Удачи!
Ответ 2
Я лично использовал бы сборку .Net вместо инструмента командной строки, когда это было возможно.
Плюсы:
- проще развернуть (вам не нужно копировать исполняемый файл)
- улучшенная переносимость (в зависимости от параметров компиляции инструмента командной строки он не может работать на некоторых платформах, с другой стороны, чистые .Net управляемые сборки, скомпилированные для целевого AnyCPU, должны отлично работать на машинах x86/x64)
- упрощение манипулирования библиотекой сторонних разработчиков (параметры функции vs разбор/форматирование командной строки)
- выберите, будете ли вы синхронно вызывать свои методы; с другой стороны, отдельный процесс должен быть асинхронным. Синхронизация потоков/процессов - это не тривиальное задание.
- вам не придется иметь дело с IPC, поскольку все в одном процессе
- гораздо проще отлаживать (пошаговое отладка... и т.д.)
Менеджмент исключений
- также проще (вы получите полную трассировку стека, а не только код завершения фиктивного процесса).
- использование .Net-концепций (объектно-ориентированное программирование,
Exceptions
, events
... и т.д.)
Ответ 3
Я согласен с 1, 2 и 3. Запуск нового процесса для каждого шифрования/дешифрования определенно дороже, чем выполнение его в процессе. Это становится еще более важным, если вам нужно одновременно выполнять множественное шифрование/дешифрование, которое читает ваш вопрос, который я ожидаю от вас.
Кроме того, есть ли 64-разрядная версия инструмента командной строки? Это может быть аргументом против.
Ответ 4
Это проще сделать. Два из ваших трех предметов возвращаются к этому.
Третий, возможно, истинный, потому что там меньше процессов и нет необходимости обмениваться данными между ними или false, потому что исполняемый файл обеспечивает гораздо лучшую производительность, чем сборка, и это повышает вес этого эффекта.
Но простота приобретает чертовски много, и она продолжает давать (вам, возможно, придется поддерживать это приложение в течение некоторого времени). Наверное, есть и другие "плюсы", которые можно подумать о том, что в конце концов дойдет до этого.
Действительно, когда что-то более простое (и действительно более простое, а не сирена-вызов сверхпростого, который в конечном итоге становится более сложным), вам понадобится действительно контр-аргументы, чтобы взвесить это.