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

C# WinForms调用System.Windows.Clipboard引发加载异常求助

解决WinForms调用Clipboard触发TypeInitializationException的问题

问题背景

我在运行一个C# WinForms应用,需求是将.JMP文件内容转存到.csv文件中处理,不想使用JMP/JSL方案,因为已有成熟的CSV解析代码。但只要调用以下代码:

Clipboard.SetDataObject(myData);

就会立即进入中断模式,抛出异常:

System.TypeInitializationException
HResult=0x80131534
Message=The type initializer for '<Module>' threw an exception.
Source=<Cannot evaluate the exception source>
StackTrace: Cannot evaluate the exception stack trace

Inner Exception 1:
ModuleLoadException: The C++ module failed to load during appdomain initialization.

Inner Exception 2:
TypeLoadException: Could not load type 'System.Windows.Media.DisableDpiAwarenessAttribute' from assembly 'WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

核心困惑:这是纯WinForms应用,无C代码却报C模块加载失败;WindowsBase是WPF程序集,无法添加引用,仅调用Clipboard时触发报错。已放置PresentationCore.dll和System.Windows.Forms.dll,问题仍存在。

核心原因

你误用了WPF的System.Windows.Clipboard类,WinForms应用调用该类会间接触发WPF组件的加载,而缺少WindowsBase.dll等依赖时就会出现类型加载失败。此外,手动复制DLL容易出现版本不匹配问题。

解决步骤

1. 改用WinForms原生Clipboard类

直接替换为WinForms专属的System.Windows.Forms.Clipboard,完全无需依赖WPF组件:

// 确保添加命名空间引用
using System.Windows.Forms;

// 调用WinForms原生Clipboard方法
Clipboard.SetDataObject(myData);

默认WinForms项目已引用System.Windows.Forms程序集,无需额外操作。

2. 若必须使用WPF Clipboard,添加正确依赖

如果因特殊需求需使用WPF的Clipboard类,不要手动复制DLL,通过项目引用添加:

  • 右键项目 → 添加 → 引用 → 程序集 → 框架,找到并勾选WindowsBase和PresentationCore,确保版本与项目的.NET框架版本一致。

3. 升级到较新的.NET版本

若项目基于.NET Framework,尝试升级到.NET 6/7/8(跨平台WinForms)。新版本的WinForms Clipboard API已优化,不会依赖WPF组件,从根源避免此类问题。

4. 检查DPI感知配置

若仍有问题,可在app.config中添加DPI感知配置:

<configuration>
  <appSettings>
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
  </appSettings>
</configuration>

或在项目属性的“应用”选项卡中设置DPI感知为“系统感知”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:06:22