当输出类型为类库时,从.dll启动新进程不工作
本文关键字:新进程 进程 工作 启动 dll 类型 输出 类库 | 更新日期: 2023-09-27 18:10:08
我需要的是从。dll开始一个新进程,它位于/lib
文件夹中…在我的解决方案中有一个控制台应用程序项目,我想从。
当我将这个特定项目的输出类型设置为Console Application时,它会生成一个.exe文件。当我将。exe文件重命名为。dll时,我可以从它开始一个新的进程。但是当我在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…
如果没有提供命令行参数,就让控制台应用程序停止,而不是试图愚弄最终用户。这足以防止双击破坏。然后,应用程序可以使用正确的命令行参数启动该进程。
如果被合同允许,你能把所有的逻辑保存在DLL文件中吗-包括"危险"的东西?只有一个简单的控制台应用程序"launcher"需要一个命令行参数(如C.Evenhuis建议)。
这似乎将"危险"代码保存在DLL文件中,使其无法轻松执行。启动器需要一个特殊的(可能是秘密的)命令行参数。
为了更安全,您可以通过STDIN将"secret"传递给启动器。
如果这不符合标准,您将不得不返回到重命名可执行文件。您可以将其添加为构建后步骤。