如何在 C# 中检索 macOS 上已安装的打印机



我正在编写一个控制台应用程序,应用程序需要做的一件事是检索所有用户已安装的打印机(及其纸张源(的列表。我们可以通过Windows上的System.Drawing.Printing.PrinterSettings.InstalledPrinters轻松获取此信息,但是在macOS上访问相同的属性似乎返回了一个空列表。

我们为此应用程序使用 .NET Core v2.2。

我们使用的代码如下:

foreach (string pName in PrinterSettings.InstalledPrinters) {
// this should iterate each of the installed printers
}

在 Windows 上,它会按预期迭代每台打印机。但是,在Mac上,它什么都不做。

"已安装的打印机"属性是否在 macOS 上不起作用,或者是否有其他原因阻止它正常工作?如果它不起作用,还有其他方法可以检索列表吗?

是的,我遇到了同样的问题。 添加System.Drawing.Common命名空间就可以解决问题。然后可以解析命名空间。我的清单上装满了可用的打印机。

对我来说听起来像是.NET Core中的一个错误。

您使用的是哪个版本的 .NET Core?

.NET Core 2.1(及更高版本(具有实现在macOS/Linux上查找已安装打印机的代码:https://github.com/dotnet/corefx/blob/master/src/System.Drawing.Common/src/System/Drawing/Printing/PrintingServices.Unix.cs

所以它应该可以工作(除非某处有错误(。

Lpinfo (CUPS( 解决方法:

using System.Diagnostics;
var startInfo = new ProcessStartInfo("lpstat", "-p")
{
RedirectStandardOutput = true,
CreateNoWindow         = true
};
var process   = Process.Start(startInfo);
var output = await process.StandardOutput.ReadToEndAsync();
var printerNames = output.Split("n", StringSplitOptions.RemoveEmptyEntries)
.Select(line => line.Split(" ")[1])
.Where(name => !string.IsNullOrWhiteSpace(name))
.ToArray();
await process.WaitForExitAsync();
Console.WriteLine(string.Join("n",printerNames));

最新更新