c# - 函数 VB.NET 到 C# 的转换
问题描述
我有一个应用程序,我需要将 Excel 文件打印到默认打印机以外的特定打印机。
在 VB.NET 中,我在网上找到了一个允许我执行此操作的函数。
xlApp.ActivePrinter = FindPrinter("PrinterName")
FindPrinter 函数的代码是
Function FindPrinter(ByVal PrinterName As String) As String
Dim Arr As Object
Dim Device As Object
Dim Devices As Object
Dim Printer As String
Dim RegObj As Object
Dim RegValue As String
Const HKEY_CURRENT_USER = &H80000001
RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
RegObj.EnumValues(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr)
For Each Device In Devices
RegObj.getstringvalue(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue)
Printer = Device & " on " & Split(RegValue, ",")(1)
If InStr(1, Printer, PrinterName, vbTextCompare) > 0 Then
FindPrinter = Printer
Exit Function
End If
Next
End Function
在 C# 中,我有这样的代码
public string FindPrinter(string PrinterName)
{
string FindPrinterRet = default;
var Arr = default(object);
var Devices = default(object);
string Printer;
object RegObj;
var RegValue = default(string);
const int HKEY_CURRENT_USER = int.MinValue + 0x00000001;
RegObj = Microsoft.VisualBasic.Interaction.GetObject(@"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
RegObj.EnumValues(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr);
foreach (var Device in (IEnumerable)Devices)
{
RegObj.GetStringValue(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue);
Printer = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Device, " on "), Strings.Split(RegValue, ",")[1]));
if (Strings.InStr(1, Printer, PrinterName, Constants.vbTextCompare) > 0)
{
FindPrinterRet = Printer;
return FindPrinterRet;
}
}
return FindPrinterRet;
}
但是 foreach 循环之前的行导致 .EnumValues 部分出现问题,因为 C# 不确定如何处理这个问题,与 for 循环内的 RegObj.GetStringValue 相同。
据我所知,这些值只是 VB.NET 中 System.Object 类的一部分,但我找不到让它们在 C# 中工作的方法。
感谢所有花时间帮助我的人。
确切的错误是“object”不包含“EnumValues”的定义,并且找不到接受“object”类型的第一个参数的可访问扩展方法“EnumValues”。
解决方案
逐字翻译更像是:
static string? FindPrinter(string PrinterName)
{
const int HKEY_CURRENT_USER = int.MinValue + 0x00000001;
dynamic regObj = Interaction.GetObject(@"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")!;
regObj!.EnumValues(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", out dynamic devices, out dynamic arr);
foreach (var device in devices)
{
regObj.GetStringValue(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", device, out dynamic value);
var printer = $"{device} on {value.Split(',')[1]}";
if (printer.Contains(PrinterName, StringComparison.OrdinalIgnoreCase))
return printer;
}
return null;
}
但是,从类到 WMI PrinterSettings.InstalledPrinters
,有更好的方法来做你想做的任何事情。LocalPrintServer
而且即使你坚持自己使用注册表,也有比像这样使用 COM 更好的方法。
推荐阅读
- batch-file - 从所有用户的桌面删除所有图标的批处理脚本
- vba - 编写在模块生成#VALUE 中的公式
- java - 在启动 Activity 时传递 InputConnection 对象
- node.js - 将 NodeJS 应用程序变量绑定到 Pivotal Cloud Foundry 服务
- python - Python tabula-py 错误(熊猫错误?)
- mxnet - 获取隐藏层输出
- excel - 编辑数据连接
- javascript - 将 json 对象返回给渲染方法 - React.js
- c - 共享内存段:如何调整它的大小?
- python - Django 显示不同的模型/标签