C# WinForms调用System.Windows.Clipboard引发加载异常求助
问题背景
我在运行一个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

