【问题标题】:Start new process from .dll not working, when output type class-library当输出类型类库时,从 .dll 启动新进程不起作用
【发布时间】: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


【解决方案1】:

与其试图欺骗最终用户,不如让控制台应用程序在没有提供命令行参数的情况下停止。这足以防止双击破坏。然后,您的应用程序可以使用正确的命令行参数启动该进程。

【讨论】:

  • 好吧,不,如果我必须做空的话,设计不允许,合同也不允许。
  • 所以你不想要明显的(构建后重命名),但你不能做任何其他事情。
  • 我不允许吗?我不知道。必须有一些功能,我们只能在单独的进程上运行时才能提供这些功能。以这种方式指定要求,因此该功能只能从这个特定的应用程序运行,我们有解决方案,我只想探索其他选项,如果有的话。我不明白,为什么这里的所有人都在说:“你愚弄用户......”而不是某种“不,你不能按照你想要的方式做 - 据我所知”我以为我描述了限制很好。
  • 好吧,精明的用户仍然可以使用相同的参数调用该过程。进程监视器和 ILSpy 等工具使这变得非常容易。因此,如果“用户无法执行它”的要求可以重新表述为“用户可能不会执行它”,那很好:)
【解决方案2】:

如果合同允许,您能否将所有逻辑保留在 DLL 文件中 - 包括“危险”的东西?只有一个需要命令行参数的简单控制台应用程序“启动器”(如 C.Evenhuis 建议的那样)。

这似乎将“危险”代码保留在无法轻松执行的 DLL 文件中。启动器需要一个特殊的(可能是秘密的)命令行参数。

为了更加安全,您可以通过 STDIN 将“秘密”传递给启动器。

如果这不符合条件,您将不得不返回重命名可执行文件。您可以将其添加为构建后步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2012-08-31
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多