我有一个.NET类库,它有一个带静态方法的类。我希望我的代码在一个单独的进程中运行该静态方法 - 就像我在一个单独的进程中运行它一样。
我知道我可以创建一个单独的控制台应用程序项目从Main()
内部调用静态方法,但这对我的部署方案不方便 - 我宁愿不携带额外的.exe文件。我知道我可以use Powershell调用它但这意味着依赖于Powershell,我宁愿避免。
有没有办法在仅使用.NET的单独进程中运行代码?也许我可以在运行时为这个单独的进程创建可执行文件?
答案 0 :(得分:26)
Unfortunately, you cannot fork
in C# like you can in C on POSIX-compatible operating systems.
您有几个选择。由于您只是希望防止无限循环,您可以生成一个新的Thread
(一个新一个,而不是ThreadPool
个或Task
一)。然后,如果您需要杀死它,可以在线程上调用Abort
。这将在另一个线程中触发ThreadAbortException
。
您的其他选项是AppDomain
。 You can create a new AppDomain
using the currently running assembly relatively trivially.然后,您调用跨域实际存在的代理对象。代理将使用旧式.NET远程处理来调用真实对象上的方法(因此,没有泛型传递等,因为您受基于.NET 1.1的构造的限制)。
请注意,上述策略都不能保护您免受非托管代码崩溃的影响。由于AppDomains是托管构造,因此您无法使用它们来中止非托管挂起。
如果你真的,真的,确实决定获得第二个操作系统级别的进程,你也可以在一个临时文件中生成一个新的可执行程序集并在一个新的启动处理。 See here for an MSDN article on new assembly generation.请注意,这根本不是微不足道的。