【问题标题】:Can I run C# code in a separate process without crafting a console application?我可以在单独的进程中运行 C# 代码而不制作控制台应用程序吗?
【发布时间】:2012-10-18 10:26:46
【问题描述】:

我有一个 .NET 类库,其中包含一个带有静态方法的类。我希望我的代码在一个单独的进程中运行该静态方法 - 就像我在一个单独的线程中运行它只是在一个单独的进程中一样。

我知道我可以创建一个单独的控制台应用程序项目,从 Main() 内部调用静态方法,但这不适合我的部署方案 - 我宁愿不携带额外的 .exe 文件。我知道我可以 use Powershell 来调用它,但这意味着依赖于我宁愿避免的 Powershell。

有没有办法仅使用 .NET 在单独的进程中运行代码?也许我可以在运行时为那个单独的进程创建可执行文件?

【问题讨论】:

  • 您可以在现有应用程序中使用命令行选项吗?
  • 为什么需要这样做?初始进程完成后,该进程是否应该继续运行?
  • @Gabe:不,我当前的代码是加载到代理中的类库。
  • 然后创建一个新的应用程序域来运行任务,并在失败时将其删除,而不是启动一个全新的进程,难道没有意义吗?
  • 如果它是一个没有调用非托管代码的线程,那么您不必弄乱应用程序域 - 如果线程挂起,您可以杀死它。

标签: c# .net


【解决方案1】:

Unfortunately, you cannot fork in C# like you can in C on POSIX-compatible operating systems.

您有几个选择。由于您只是想防止无限循环,您可以生成一个新的Thread(一个,而不是ThreadPoolTask 一个)。然后,如果你需要杀死它,你可以在线程上调用Abort。这将在另一个线程中触发ThreadAbortException

您的另一个选项是AppDomainYou can create a new AppDomain using the currently running assembly relatively trivially. 然后,您调用跨域实际存在的代理对象。代理将使用老式 .NET 远程处理来调用真实对象上的方法(因此没有泛型传递等,因为您受到基于 .NET 1.1 的构造的限制)。

请注意,上述策略都不能保护您免受非托管代码崩溃的影响。由于 AppDomain 是托管构造,因此您不能使用它们来中止非托管挂断。

如果您真的,真的,真的决心获得第二个操作系统级别的进程,您还可以在一个临时文件中动态生成一个新的可执行程序集,然后在一个新的过程。 See here for an MSDN article on new assembly generation. 请注意,这根本不是小事。

【讨论】:

  • +1 表示动态生成程序集以在单独的进程中运行的可怕想法。
  • @sharptooth 这能回答问题吗?
  • 好吧,我找到了这个很好的答案stackoverflow.com/a/826435/57428,关于如何在运行时制作控制台应用程序。这一点都不难。
  • 我知道这已经很老了,我正在尝试解决同样的问题,但现在在 .NET Core 中。您链接到的示例不会启动新流程,我相信这是您的要求之一?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多