.NET 6在Linux系统中获取已安装打印机列表的问题及替代方案咨询
解决.NET跨平台(Linux)下打印机访问问题的替代方案
针对你在.NET 6环境中依赖System.Drawing.Printing导致Linux容器运行异常,且.NET 7将移除System.Drawing.EnabledUnixSupport配置的问题,这里有几个生产环境可行的替代方案:
1. 基于CUPS系统的原生访问(推荐Linux场景)
Linux系统几乎都依赖**CUPS(Common UNIX Printing System)**管理打印服务,你可以通过两种方式对接:
- 使用CUPS的REST API:CUPS默认提供HTTP接口(默认端口631),直接发送请求即可获取打印机列表、提交打印任务。示例代码:
using System.Net.Http; using System.Xml.Linq; public List<string> GetInstalledPrinters() { var printers = new List<string>(); using var httpClient = new HttpClient { BaseAddress = new Uri("http://localhost:631/") }; var response = httpClient.GetAsync("printers").Result; response.EnsureSuccessStatusCode(); // 解析CUPS返回的XML响应,提取打印机名称 var xmlContent = XDocument.Parse(response.Content.ReadAsStringAsync().Result); foreach (var printerElem in xmlContent.Descendants("printer-name")) { printers.Add(printerElem.Value); } return printers; } - 使用.NET包装库:社区有封装CUPS API的NuGet包(比如
CUPS.NET),可以简化调用逻辑,避免手动解析XML。
2. 生成可打印文件+系统命令行工具
如果你的场景需要打印内容(而非仅获取打印机列表),可以先将内容生成通用格式(如PDF),再调用Linux系统的打印命令(lp或lpr)完成打印:
using System.Diagnostics; using PdfSharpCore.Drawing; using PdfSharpCore.Pdf; public void PrintContent(string content) { // 生成PDF文件 var pdfDoc = new PdfDocument(); var page = pdfDoc.AddPage(); using var gfx = XGraphics.FromPdfPage(page); gfx.DrawString(content, new XFont("Arial", 14), XBrushes.Black, new XPoint(20, 20)); var tempPath = "/tmp/print-output.pdf"; pdfDoc.Save(tempPath); // 调用lp命令提交打印任务 var processStartInfo = new ProcessStartInfo { FileName = "lp", Arguments = $" -d <打印机名称> {tempPath}", // 指定打印机,省略则用默认 UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; using var process = Process.Start(processStartInfo); process.WaitForExit(); // 处理执行结果 var output = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); if (!string.IsNullOrEmpty(error)) { // 处理打印错误 throw new InvalidOperationException($"打印失败: {error}"); } }
3. 跨平台UI框架的打印API(如果是桌面应用)
如果你的项目是跨平台桌面应用(比如MAUI、Avalonia),可以直接使用框架内置的打印功能:
- MAUI提供
IPrintService接口,支持Windows、Linux、macOS的打印操作 - Avalonia有
PrintDialog组件,可跨平台调用系统打印对话框
补充说明
System.Drawing.EnabledUnixSupport被移除的核心原因是:System.Drawing原本就是Windows专属组件,Linux下的实验性支持存在稳定性和兼容性问题,官方不推荐在生产环境依赖。上述方案都是基于Linux原生生态或跨平台库,更符合.NET跨平台的设计理念。
内容的提问来源于stack exchange,提问作者Jernej Habjan




