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.