Внутри тела функции, первым делом, создаем объект директории-источника и сохраняем его в переменной dir класса DirectoryInfo. Если, в результате, объект dir нулевой, тогда папка-источник не существует, выводим соответствующее сообщение. Если проверка завершилась успешно, т.е. объект dir инициализирован, тогда в массив объектов DirectoryInfo - dirs помещаем все подпапки. Далее, выполняем проверку на существование папки приемника, если ее нет, то - создаем ее. Затем, в массив files объектов класса FileInfo сохраняем список файлов, находящихся в папке-источнике. После этого, в цикле foreach копируем каждый файл из папки источника в папку-приемник. Далее, если флаг copySubDirs имеет положительное значение, тогда копируем содержимое каждой подпапки из массива dirs с помощью рекурсивных вызовов рассматриваемой функции - DirectoryCopy.
В-пятых, там, где раньше были операторы File.Exist, проверяющие существование исполняемого файла exe, теперь, должны быть Directory.Exist, соответственно, проверяющие существование папки - исполняемого объекта с расширением app.
На этом, изменения исчерпали себя. Проект готов к эксплуатации.