You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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系统的打印命令(lplpr)完成打印:

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

火山引擎 最新活动