c# crash outlook clipboard memory-corruption

c# - Clipboard.Clear() bloquea Outlook y Visual Studio



crash memory-corruption (3)

Tengo uno de los errores más extraños que he visto en mi vida.

Eche un vistazo a esta aplicación de Windows Forms creada desde cero:

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(); } }

Nada especial, simplemente despejando el portapapeles cuando se hace clic en el botón.

Ahora, si ejecuto esto en Debug desde Visual Studio, borre el portapapeles varias veces, luego cierre la aplicación, luego intente cerrar Visual Studio, Visual Studio se cuelga con una excepción de "Memoria corrupta". Esto no ocurre el 100% del tiempo, pero cuando lo hace, ya no puedo iniciar Visual Studio, tengo que reiniciar.

Esto parece afectar también a Outlook. Si tengo Outlook abierto, entonces inicie esta aplicación, borre el portapapeles varias veces, luego vuelva a Outlook, Outlook también se cuelga y, al igual que Visual Studio, tengo que reiniciar para poder usarlo nuevamente.

Así que estoy empezando a desconfiar de lo que hace la clase del Portapapeles de Windows Forms en el método Clear() . Para confirmar mi teoría, utilicé la clase Clipboard que viene con WPF. Hice una referencia a PresentationCore.dll en mi aplicación WinForms y reemplacé:

System.Windows.Forms.Clipboard.Clear();

con

System.Windows.Clipboard.Clear();

Y ahora ni Visual Studio ni Outlook se cuelgan.

Busqué en Google esto un poco, y encontré esta publicación sin una solución clara al problema.

Así que supongo que mi pregunta es, ¿es esto un error real en la clase del Portapapeles de WinForms, o me falta algo?

Información adicional:

  • Visual Studio 2012
  • Proyecto ejecutándose bajo .NET 4.0.
  • Outlook 2010

Pila de llamadas de bloqueo de 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


Este es un error conocido que causa daños en la memoria en máquinas de 64 bits. Está arreglado en Windows 8.

Una solución consiste en hacer

Clipboard.SetText("");


en .Net 4.0, el código no es suficiente. una excepción ocurrió.

Clipboard.SetText("");

usa este código ...

Clipboard.SetDataObject("", false);


Logré resolver el problema solo devolviendo el proyecto a .NET 3.5 desde .NET 4.0.