我有我见过的最奇怪的错误之一。
看看这个从头开始创建的 Windows 窗体应用程序:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
System.Windows.Forms.Clipboard.Clear();
}
}
没什么特别的,只是在单击按钮时清除剪贴板。
现在,如果我在 Visual Studio 的 Debug 中运行它,清除剪贴板几次,然后关闭应用程序,然后尝试关闭 Visual Studio,Visual Studio 会因“内存损坏”异常而崩溃。这不是 100% 发生的,但是当它发生时,我什至无法再启动 Visual Studio,我必须重新启动。
这似乎也会影响 Outlook。如果我打开了 Outlook,然后启动这个应用程序,清除几次剪贴板,然后切换回 Outlook,然后 Outlook 也会崩溃,就像 Visual Studio 一样,我必须重新启动才能再次使用它。
所以我开始非常怀疑 Windows 窗体剪贴板类在该Clear()
方法中的作用。为了证实我的理论,我使用了 WPF 附带的 Clipboard 类。我在我的 WinForms 应用程序中引用了 PresentationCore.dll,并替换了:
System.Windows.Forms.Clipboard.Clear();
和
System.Windows.Clipboard.Clear();
现在 Visual Studio 和 Outlook 都不会崩溃。
我用谷歌搜索了一下,发现这篇文章没有明确的解决方案。
所以我想我的问题是,这是 WinForms 剪贴板类中的一个真正的错误,还是我遗漏了什么?
附加信息:
- 视觉工作室 2012
- 在 .NET 4.0 下运行的项目。
- 展望 2010
Outlook 崩溃调用堆栈:
Unhandled exception at 0x77a7e3be in OUTLOOK.EXE: 0xC0000005:
Access violation reading location 0x5c83d763.
ntdll.dll!@RtlpLowFragHeapFree@8() + 0x2c bytes
ntdll.dll!_RtlFreeHeap@12() + 0x7e bytes
kernel32.dll!_HeapFree@12() + 0x14 bytes
mshtml.dll!ParseExpandProperty() + 0x2d6 bytes
mshtml.dll!PROPERTYDESC::HandleStyleComponentProperty() - 0xc2707 bytes
mshtml.dll!MSCSSParser::SetStyleProperty() + 0x268 bytes
mshtml.dll!MSCSSParser::Declaration() + 0x95 bytes
mshtml.dll!MSCSSParser::Write() + 0x8b0 bytes
mshtml.dll!BaseCSSParser::LoadFromStream() + 0x15a bytes
mshtml.dll!CStyleSheet::DoParsing() + 0x18b bytes
mshtml.dll!CStyleElementHelper::OnDwnChan() + 0x315 bytes
mshtml.dll!CStyleElementHelper::SetCssCtx() - 0x130a5f bytes
mshtml.dll!CStyleElementHelper::EnsureStyleDownload() + 0xfd bytes
mshtml.dll!CStyleElementHelper::AttachExternalStyleSheet() + 0x97 bytes
mshtml.dll!CLinkElement::HandleLinkedObjects() + 0xf0 bytes
mshtml.dll!CLinkElement::Notify() - 0x189c54 bytes
mshtml.dll!CHtmRootParseCtx::FlushNotifications() + 0x134 bytes
mshtml.dll!CHtmRootParseCtx::Commit() + 0xb bytes
mshtml.dll!CHtmParse::Commit() + 0x3c bytes
mshtml.dll!CHtmPost::Broadcast() + 0xf bytes
mshtml.dll!CHtmPost::Exec() + 0x11c bytes
mshtml.dll!CHtmPost::Run() + 0x40 bytes
mshtml.dll!PostManExecute() + 0x8e bytes
mshtml.dll!PostManResume() + 0x96 bytes
mshtml.dll!CHtmPost::OnDwnChanCallback() + 0x10 bytes
mshtml.dll!CDwnChan::OnMethodCall() + 0x1f bytes
mshtml.dll!GlobalWndOnMethodCall() + 0xf8 bytes
mshtml.dll!GlobalWndProc() + 0x4517a bytes