C# 通过C打开VB程序时日期格式不正确# 发生什么事:

C# 通过C打开VB程序时日期格式不正确# 发生什么事:,c#,.net,vb.net,winforms,C#,.net,Vb.net,Winforms,我为本地企业维护了一些小型.NET应用程序。我们有一对可以协同工作的应用程序:一个“客户端管理器”(C#/.NET 4.?/winforms)和一个“标签打印机”(VB/.NET 2.0/winforms) 我最近在客户机管理器中添加了一个“打印标签”按钮。这将打开标签打印机并从客户端管理器中预填充客户端名称。呜呼 不幸的是,只有当标签打印机以这种方式打开时,日期才会以“dd/MM/yyyy”格式打印出来,而不是“MM/dd/yyyy” 据我所知: 日期通过标签打印机中默认为“今天”的Date

我为本地企业维护了一些小型.NET应用程序。我们有一对可以协同工作的应用程序:一个“客户端管理器”(C#/.NET 4.?/winforms)和一个“标签打印机”(VB/.NET 2.0/winforms)

我最近在客户机管理器中添加了一个“打印标签”按钮。这将打开标签打印机并从客户端管理器中预填充客户端名称。呜呼

不幸的是,只有当标签打印机以这种方式打开时,日期才会以“dd/MM/yyyy”格式打印出来,而不是“MM/dd/yyyy”

据我所知:
  • 日期通过标签打印机中默认为“今天”的DateTime winforms输入
  • 无论默认日期是保留还是手动更改,我们都会看到格式错误
  • 我们不会从客户经理那里发送日期。
  • 我们在标签打印机应用程序中使用
  • 双击快捷方式/EXE打开标签打印机时,不会出现这种情况
  • 这只发生在我们的Windows7松下Toughbook上
  • 无论我打印到Dymo标签打印机还是PDF,日期都是错误的。(谢谢,@jdweng!)
  • 根据任务管理器,标签打印机作为唯一的本地用户运行,无论我如何加载它。(谢谢,@Polyfun!)
  • 标签打印机的
    CurrentCulture
    CurrentUICulture
    都是
    en-US
    ,无论我如何加载它。(谢谢,@Jimi!)
  • 用户配置文件通过“控制面板>区域”使用
    M/d/yyyy
    。(谢谢,@Hans Passant!)
相关代码 以下是我在客户端管理器中用于打开标签打印机应用程序的C代码(为清晰起见添加了注释):

private void btnLabels\u单击(对象发送方,事件参数e)
{
//通过应用程序“选项”菜单中的混合字符串/文件输入进行设置。
字符串labelAppLocation=Properties.Settings.Default.labelAppLocation;
if(String.IsNullOrEmpty(labelAppLocation))
{
MessageBox.Show(“我们不确定您的标签打印机应用程序位于何处!请在\“选项>>管理列表>>文件\”中进行设置,然后重试。”);
}
其他的
{
过程p=新过程();
ProcessStartInfo psi=新的ProcessStartInfo();
psi.FileName=labelAppLocation;
//此类有一些用于
//客户姓名和其他我们希望稍后发送的人口统计信息。
LabelArgs newLabelArgs=新LabelArgs();
newLabelArgs.Name=this.clientName.Text;
psi.Arguments=newLabelArgs.ToString();
p、 StartInfo=psi;
p、 Start();
}
}
下面是标签打印机中的VB代码,其中日期值被添加到标签中:

私有子DrawItemLabel(ByVal e作为System.Drawing.Printing.PrintPageEventArgs)
尺寸g为图形=e.图形
'自定义字体处理程序
将字体变暗为新的ItemLabelFonts
“…设置字体,设置其他行项目。。。
“`myDate`直接来自DateTime输入的”.Value`。
Dim STRIMDLINE字符串=myDate.ToSortDateString&&myClientID&&myCounty
fonts.MIDLEFONT=ChooseMXFontForWidth(strMidLine,fonts.MIDLEFONT,maxWidth,g)
“…在绘制标签之前,先计算一下间距…”。。。
g、 抽绳(myClientName、fonts.BottomFont、Brush.Black、0、bottomTop)
端接头
我的想法是:
  • 也许
    Process#Start()
    正在丢失当前区域性,并在某个地方返回到
    dd/MM/yyyy
    默认值?(未通过用户的“区域”设置确认)
  • 也许.NET4.x和.NET2.0玩得不好
  • 当传递参数时,标签打印机的行为可能不同,我需要通过这些参数添加用户配置文件或区域?表单的
    Load
    hook中没有逻辑来解释这一点
我所尝试的:
  • 检查DateTime输入的设置以查找区域回退
  • 更改用户的区域设置以查看是否可以“重置”格式
  • 复制Windows 10和Windows XP中的行为(没有运气!)
  • 将其关闭并再次打开
  • 仔细研究MSDN

为什么可以通过
新流程().Start()打开应用程序更改其日期格式?

我认为我们缺少区域/日期/时区格式的某些内容-隐藏在某处

我有一个Powershell脚本将日期设置为Australian。以下是代码和XML:

然后我搜索了一个美国版本,在这里找到了:


成功!我将标签打印机应用程序的目标从.NET 2.0重定为.NET 4.0(与客户端管理器应用程序相匹配),清除了新的警告,并重建了应用程序。运行标签打印机的v4.0版本修复了该问题,没有明显的副作用

我本应该早点完成这项工作——我原以为从2.0升级到4.0会是一项艰巨的任务,但没有生成错误,唯一的警告是隐式转换。所有这些都不会影响日期变量,所以我仍然不清楚为什么2.0版本表现得如此奇怪,但我很高兴将这个错误解决。我不打算很快写任何新的.NET2.0项目


在任务管理器的“详细信息”中,确保显示“用户名”列(右键单击列标题并选择“列”)。标签打印机是否以预期用户名运行?否,Process类没有此类权限。很难想出另一个理论,没有其他东西可以看。意外格式化的常见原因是用户在“控制面板”>“区域”中的重写。@jdweng我在将标签打印到PDF而不是物理打印机时也看到了相同的结果,因此我认为这不是问题所在。谢谢你的其他建议!我会尽快检查的。你按照汉斯的建议检查了吗?我猜
LabelArgs.ToString()
的代码包含了答案。检查标签打印机应用程序在“工作”PC上启动的命令行与在“非工作”PC上启动的命令行也是可能的
#Set Windows regional format (date/time etc.) to Australia - this applies to all users

# Set Locale, language etc.
& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"C:\temp\AURegion.xml`""

# Set Timezone
& tzutil /s "AUS Eastern Standard Time"

# Set languages/culture
Set-Culture en-AU 

$currentlist = Get-WinUserLanguageList
Write-Host "new lang" $currentlist.LanguageTag
#Set Windows regional format (date/time etc.) to American - this applies to all users

if (!(test-path c:\temp)) {
New-Item c:\temp -ItemType Directory
} 

[xml]$XmlDocument = invoke-webrequest -Uri https://raw.githubusercontent.com/poorleno1/systemlocale/master/USRegion.xml -UseBasicParsing | Select-Object -ExpandProperty content

$XmlDocument.Save("c:\temp\USRegion.xml")

# Set Locale, language etc.
& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"C:\temp\USRegion.xml`""

# Set Timezone
& tzutil /s "Central European Standard Time"

# Set languages/culture
Set-Culture en-US

$currentlist = Get-WinUserLanguageList
Write-Host "new lang" $currentlist.LanguageTag