【发布时间】:2014-06-24 13:42:25
【问题描述】:
我需要从位于 /lib 文件夹中的 .dll 启动一个新进程...好吧,我的解决方案中有一个控制台应用程序项目,我想从中生成所需的 .dll。
当我将此特定项目的输出类型设置为控制台应用程序时,它会生成一个 .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 不是可执行的应用程序。如果这个需要是一个类库,那么为什么不编写一个可执行的控制台应用程序,它只引用这个类库并调用其中的逻辑呢?
-
DLL 和 .EXE 一样是程序集,因此它们也可以具有入口点。这样您就可以在 AppDomain 下加载 DLL 并像这样执行它们 assembly.EntryPoint.Invoke(null,Args);
-
我只希望这个 .DLLs 从应用程序中执行,而不是由用户手动执行,我无法理解这个约束的难点。
-
难以理解的是您试图同时使某些东西既可执行又不可执行。这些是相互排斥的状态。如果您想要保护某些东西,您需要控制用户工作站上的权限,或者您需要将代码保留在服务器端(由您控制)并让客户端应用程序向它发出服务请求,您可以从中获取可以根据您用来确定授权的任何标准来确定授权。
-
@David 足够接近了,但是,当它是重命名的 .EXE 时,我仍然可以正常工作,所以我只想探索,是否有任何简洁优雅的解决方案可以让这个工作正常它是这样的。我没有得到否定的苛刻,有的时候我只是试图发现可能性,或者是否有任何可能性。还是谢谢。
标签: c# visual-studio dll process.start entry-point