You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中第二次及后续启动WinForms窗口报错求助

解决PowerShell中WinForms重复运行时SetCompatibleTextRenderingDefault报错问题

问题原因

PowerShell会话是持久化的,首次运行WinForms代码时,System.Windows.Forms.Application上下文会被初始化,且已经创建了IWin32Window对象(比如你的窗体)。第二次运行时,再次调用SetCompatibleTextRenderingDefault会触发报错——该方法必须在应用中第一个IWin32Window对象创建前调用,且整个应用生命周期只能调用一次。

解决方案

修改代码,添加窗体清理逻辑,并仅在Application未初始化时调用SetCompatibleTextRenderingDefault:

# 清理已打开的WinForms窗体,释放资源
foreach ($openForm in [System.Windows.Forms.Application]::OpenForms) {
    $openForm.Close()
    $openForm.Dispose()
}

# 仅当Application未初始化时,调用SetCompatibleTextRenderingDefault
if (-not [System.Windows.Forms.Application]::IsInitialized) {
    [System.Windows.Forms.Application]::SetCompatibleTextRenderingDefault($false)
}

# 你的窗体逻辑
$mainForm = New-Object System.Windows.Forms.Form
$mainForm.Text = "测试窗体"
$mainForm.Size = New-Object System.Drawing.Size(300, 200)

# 可添加自定义控件示例
$label = New-Object System.Windows.Forms.Label
$label.Text = "Hello World"
$label.AutoSize = $true
$label.Location = New-Object System.Drawing.Point(10, 10)
$mainForm.Controls.Add($label)

$mainForm.ShowDialog()
$mainForm.Dispose()

额外说明

  • 如果你希望每次运行脚本后完全终止WinForms应用上下文,可以在脚本末尾添加:
    [System.Windows.Forms.Application]::Exit()
    
    但注意这会结束当前PowerShell会话中所有WinForms相关进程,适合独立运行的脚本场景。

内容的提问来源于stack exchange,提问作者JohnyL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:47:35