You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重启.NET Core(含2.x)C#控制台应用?常规方案无效

How to Restart a .NET Core 2.x+ Console Application

Got it, let's tackle this restart problem for .NET Core console apps—since the usual full-framework C# console tricks don't translate directly here, and most answers out there focus on ASP.NET, I've put together reliable, console-specific approaches tailored for .NET Core 2.x and later versions.

Approach 1: Restart via Spawning a New Process (Most Reliable)

The core idea here is to launch a new instance of your application and then exit the current one. This works for both framework-dependent and self-contained deployments (including single-file apps in .NET Core 3.0+).

Example Code:

using System;
using System.Diagnostics;

namespace ConsoleAppRestart
{
    class Program
    {
        static void Main(string[] args)
        {
            // Optional: Detect if we're starting after a restart to run specific logic
            if (args.Length > 0 && args[0] == "--restarted")
            {
                Console.WriteLine("✅ Application restarted successfully!");
            }
            else
            {
                Console.WriteLine("Press any key to restart the app...");
                Console.ReadKey(true);
                InitiateRestart();
            }
        }

        private static void InitiateRestart()
        {
            // Get the path to the current executable (works for all deployment types in .NET Core 2.1+)
            string exePath = Environment.ProcessPath;
            
            // Build start info for the new process
            var startInfo = new ProcessStartInfo(exePath)
            {
                Arguments = "--restarted", // Pass a flag to identify restarted instances
                WorkingDirectory = Environment.CurrentDirectory,
                UseShellExecute = false // Recommended for console apps to avoid extra shell windows
            };

            // Launch the new instance
            Process.Start(startInfo);

            // Exit the current process immediately
            Environment.Exit(0);
        }
    }
}

Key Notes:

  • Use Environment.ProcessPath instead of Process.GetCurrentProcess().MainModule.FileName—it's more reliable for single-file deployments and avoids permission issues on some systems.
  • The --restarted argument is optional but useful if you need to run setup logic only after a restart.

Approach 2: Restart Using the dotnet Command (Framework-Dependent Deployments)

If your app is deployed as framework-dependent (i.e., you run it with dotnet YourApp.dll), you can explicitly call the dotnet CLI to launch a new instance:

Example Code:

private static void RestartWithDotnetCli()
{
    // Get the path to your app's entry DLL
    string dllPath = System.Reflection.Assembly.GetEntryAssembly().Location;
    
    var startInfo = new ProcessStartInfo("dotnet")
    {
        Arguments = $"\"{dllPath}\" --restarted",
        WorkingDirectory = Environment.CurrentDirectory,
        UseShellExecute = false
    };

    Process.Start(startInfo);
    Environment.Exit(0);
}

When to Use This:

  • Stick with this only if you know your app will always be run via the dotnet command. For self-contained or single-file apps, Approach 1 is better.

Approach 3: Auto-Restart on Unhandled Exceptions

If you want the app to automatically restart after a crash, you can hook into the unhandled exception event and trigger a restart:

Example Code:

static void Main(string[] args)
{
    // Hook into unhandled exceptions
    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

    // Your application logic here
    RunAppLogic();
}

private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine($"❌ Unhandled exception occurred: {e.ExceptionObject}");
    Console.WriteLine("Restarting application in 3 seconds...");
    System.Threading.Thread.Sleep(3000);
    
    // Add restart limit to avoid infinite loops
    int restartAttempts = GetRestartAttemptCount();
    if (restartAttempts >= 3)
    {
        Console.WriteLine("⚠️ Too many restart attempts. Exiting permanently.");
        Environment.Exit(1);
    }

    InitiateRestartWithAttemptCount(restartAttempts + 1);
}

private static int GetRestartAttemptCount()
{
    if (int.TryParse(Environment.GetEnvironmentVariable("RESTART_ATTEMPTS"), out int count))
    {
        return count;
    }
    return 0;
}

private static void InitiateRestartWithAttemptCount(int newCount)
{
    var startInfo = new ProcessStartInfo(Environment.ProcessPath)
    {
        Arguments = "--restarted",
        WorkingDirectory = Environment.CurrentDirectory,
        UseShellExecute = false
    };

    // Pass restart count via environment variable
    startInfo.EnvironmentVariables["RESTART_ATTEMPTS"] = newCount.ToString();

    Process.Start(startInfo);
    Environment.Exit(0);
}

private static void RunAppLogic()
{
    // Simulate a crash
    throw new InvalidOperationException("Test crash to trigger restart");
}

Critical Note:

  • Always add a restart limit (like the 3-attempt cap above) to prevent your app from getting stuck in an infinite restart loop if the root cause of the crash isn't fixed.

内容的提问来源于stack exchange,提问作者pingu2k4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:43:53