Запуск нового процесса из.dll не работает, когда выходной тип библиотеки классов

Что мне нужно, это запустить новый процесс из.dll, который находится в /lib папка... ну, у меня есть проект консольного приложения в моем решении, из которого я хочу сгенерировать.dll из.

Когда я позволяю типу вывода этого конкретного проекта установить в качестве консольного приложения, он генерирует файл.exe. Когда я затем переименую этот.exe файл в.dll, я смогу начать новый процесс с него. Но когда я изменяю тип вывода этого проекта на Class Library в Visual Studio, он доставляет.dll, но я больше не могу начать новый процесс с этой DLL (см. Код ниже).

Я не хочу делать переименование вручную и не хочу использовать какие-либо события / действия после сборки. Кроме того, поддержание сгенерированного.exe было бы хорошо, если только мы строго не хотим, чтобы пользователи не могли просто дважды щелкнуть этот.exe и позволить ему делать то, для чего он предназначен, потому что последствия могут быть жестокими.

Итак, кто-нибудь знает, пожалуйста, хорошее решение этой проблемы? Каждое предложение горячо приветствуется, советы о том, что и как установить в Visual Studio и / или что нужно изменить в моем коде, чтобы выполнить свои задачи, - но я не могу внести каких-либо существенных изменений в структуру проекта и решения, тем не менее, любая информация приветствуется. Благодарю.

Использование Visual Studio 2012 и решение все готово для использования.NET 4

Итак, как я называю новый процесс:

ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = false;
psi.ErrorDialog = false;
psi.RedirectStandardError = false;
psi.RedirectStandardOutput = false;
psi.RedirectStandardInput = false;
psi.CreateNoWindow = true;
psi.FileName = @"SomeAssembly.dll";
psi.Arguments = @"";

Process process = new Process();   //only works when SomeAssembly.dll is a renamed .exe
process.StartInfo = psi;
process.Start();

РЕДАКТИРОВАТЬ: я чувствую необходимость сказать, что этот конкретный проект в будущем может не только запускаться из приложения как новый процесс, но может быть загружен в памяти и запускаться с использованием EntryPoint.Invoke метод или только частично, создавая некоторые из его объектов таким же образом, используя отражение. Так что да, сборка.DLL должна иметь EntryPoint в то время как все еще будучи.DLL ... не стесняйтесь спрашивать дополнительную информацию, с радостью предоставит.

2 ответа

Вместо того чтобы пытаться обмануть конечного пользователя, просто остановите консольное приложение, если не были предоставлены аргументы командной строки. Этого достаточно, чтобы предотвратить уничтожение двойным щелчком. Затем ваше приложение может запустить процесс с правильным аргументом командной строки.

Если это разрешено контрактом, можете ли вы сохранить всю логику в DLL-файлах, включая "опасные" вещи? Иметь только простое консольное приложение "launcher", для которого требуется параметр командной строки (как предлагает C.Evenhuis).

Казалось бы, это сохраняет "опасный" код в DLL-файле, где его нельзя легко исключить. Для запуска требовался специальный (возможно, секретный) параметр командной строки.

Для большей безопасности вы можете передать "секрет" программе запуска через STDIN.

Если это не соответствует критериям, вам придется вернуться к переименованию исполняемого файла. Вы можете добавить его как шаг после сборки.

Другие вопросы по тегам