net471目标框架下System.Configuration.Install未找到,如何构建Windows服务?
解决dotnet build针对net471构建Windows服务时找不到System.Configuration.Install的问题
问题根源
当你用dotnet build针对.NET Framework 4.7.1编译时,SDK不会自动引用System.Configuration.Install程序集——这个程序集是Windows服务安装所需的,但.NET Core SDK的默认引用集里不包含它,而Visual Studio创建的传统.NET Framework项目会自动添加这个引用,这就是为什么VS里能正常编译但dotnet命令行不行的原因。
解决方案:手动在csproj中添加条件引用
你需要在项目文件里针对net471目标框架添加对System.Configuration.Install和System.ServiceProcess程序集的引用,修改你的csproj如下:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp2.0;net471</TargetFrameworks> </PropertyGroup> <!-- 仅针对net471添加必要的Windows服务相关引用 --> <ItemGroup Condition="'$(TargetFramework)' == 'net471'"> <Reference Include="System.Configuration.Install" /> <Reference Include="System.ServiceProcess" /> </ItemGroup> </Project>
添加完成后,再执行dotnet build -f net471,应该就能正常找到Installer类型和对应的命名空间了。
无需继承ServiceBase和Installer的替代方案
如果不想用传统的Windows服务继承模式,推荐使用TopShelf库,它能让你用更简洁的代码编写Windows服务,无需手动处理ServiceBase和Installer,还支持通过命令行直接完成安装/卸载操作,非常便捷。
具体步骤如下:
- 针对net471安装TopShelf包:
dotnet add package Topshelf -f net471 - 编写核心服务逻辑,比如一个简单的后台任务类:
#if NET471 public class MyBackgroundService { private readonly Timer _taskTimer; public MyBackgroundService() { _taskTimer = new Timer(1000); _taskTimer.Elapsed += (sender, e) => Console.WriteLine("Windows服务正在运行..."); } public void StartService() => _taskTimer.Start(); public void StopService() => _taskTimer.Stop(); } #endif - 在Program类的Main方法中配置TopShelf服务:
#if NET471 class Program { static void Main(string[] args) { HostFactory.Run(config => { config.Service<MyBackgroundService>(service => { service.ConstructUsing(_ => new MyBackgroundService()); service.WhenStarted(svc => svc.StartService()); service.WhenStopped(svc => svc.StopService()); }); config.RunAsLocalSystem(); config.SetServiceName("MyTopShelfService"); config.SetDisplayName("TopShelf示例服务"); config.SetDescription("基于TopShelf构建的轻量Windows服务"); }); } } #endif - 编译后通过命令行完成服务部署:
- 安装服务:
dotnet run -f net471 install - 卸载服务:
dotnet run -f net471 uninstall
- 安装服务:
这种方式不需要编写复杂的安装类,代码结构更清晰,同时完美兼容.NET Framework 4.7.1,完全符合你的需求。
内容的提问来源于stack exchange,提问作者jjamardo




