32

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

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

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

4

1 回答 1

30

不幸的是,您不能fork像在 POSIX 兼容操作系统上的 C 中那样使用 C#。

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

您的另一个选择是AppDomain. 您可以相对简单地使用当前正在运行的程序集创建一个新程序集。AppDomain然后,您调用跨域实际存在的代理对象。代理将使用老式 .NET 远程处理来调用真实对象上的方法(因此没有泛型传递等,因为您受到基于 .NET 1.1 的构造的限制)。

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

如果您真的、真的、真的下定决心要获得第二个操作系统级进程,您还可以在一个临时文件中动态生成一个新的可执行程序集,然后在一个新进程中启动它。有关新一代程序集的 MSDN 文章,请参见此处。请注意,这根本不是微不足道的。

于 2012-10-18T11:28:30.893 回答