我是否可以在单独的流程中运行C#代码而无需制作控制台应用程序?

sha*_*oth 26 .net c#

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

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

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

Dav*_*fer 26

不幸的是,你不能fork像C语言一样在C#POSIX兼容的操作系统上.

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

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

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

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

  • 对于动态生成程序集以在单独进程中运行的可怕想法+1. (3认同)
  • 好吧,我发现这个很好的答案http://stackoverflow.com/a/826435/57428关于如何在运行时制作控制台应用程序.这根本不难. (3认同)