.net core 版本:2.1
产生的问题:
按照官方的方式将ASP.NET Core部署成WINDOWS服务后,会报以下错误,因为是使用 dotnet.exe 来启动程序,启动目录定位到了c:\windows\system32\下,暂时没有找到怎么切换到程序目录的方法。
Application: dotnet.exe
CoreCLR Version: 4.6.28516.3
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.DirectoryNotFoundException: C:\windows\system32\
解决方法:
1. NuGet引用 Microsoft.AspNetCore.Hosting.WindowsServices
2. 修改Main入口
public class Program
{
public static void Main(string[] args)
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
if (isService)
{
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);
}
var builder = CreateWebHostBuilder(
args.Where(arg => arg != "--console").ToArray());
var host = builder.Build();
if (isService)
{
host.RunAsService();
}
else
{
host.Run();
}
}
private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.ConfigureAppConfiguration((context, builder) =>
{
builder.SetBasePath(context.HostingEnvironment.ContentRootPath)
.AddDefaultJsonFile()
.AddEnvironmentJsonFile();
})
.UseStartup<Startup>();
}
3. 修改发布设置
将目标运行时改为'win-x64'(或者win-x84),这样发布时会生成 .exe 文件(这个很重要,这样用EXE启动就解决了启动目录定位的问题),可移植方式生成的是 .dll。
4. 服务安装、启动
//安装服务
sc create MyService binPath= "\"D:\App1\MyService.exe\" \"\"" DisplayName= "MyService" start= auto
//启动服务:
sc run MyService
//停止服务:
sc stop MyService
//卸载服务:
sc delete MyService