当前位置:  开发笔记 > 编程语言 > 正文

DragDrop注册没有成功

如何解决《DragDrop注册没有成功》经验,为你挑选了2个好方法。

此异常意味着已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程.拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM).线程模型是COM的一个不幸的遗迹,它是.NET平台的前身.

如果您[STAThread]的Main函数具有该属性,则主程序线程应该已经是STA.那么,最可能的解释是这个异常发生在另一个线程上.发生异常时,查看Visual Studio(调试| Windows |线程)中的"线程"窗口,看看您是否在主线程以外的线程上.如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以执行以下操作(将此代码添加到创建控件的线程中):

Thread.CurrentThread.SetApartmentState( ApartmentState.STA )

(Thread并且ApartmentState是其成员System.Threading)

在实际启动新线程之前,需要执行该代码.正如@Tomer所述,您也可以使用该[STAThread]属性以声明方式指定.

如果您发现主线程上发生异常,请回发并告知我们,也许我们可以提供更多帮助.异常时的堆栈跟踪可能有助于追踪问题.



1> Charlie..:

此异常意味着已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程.拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM).线程模型是COM的一个不幸的遗迹,它是.NET平台的前身.

如果您[STAThread]的Main函数具有该属性,则主程序线程应该已经是STA.那么,最可能的解释是这个异常发生在另一个线程上.发生异常时,查看Visual Studio(调试| Windows |线程)中的"线程"窗口,看看您是否在主线程以外的线程上.如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以执行以下操作(将此代码添加到创建控件的线程中):

Thread.CurrentThread.SetApartmentState( ApartmentState.STA )

(Thread并且ApartmentState是其成员System.Threading)

在实际启动新线程之前,需要执行该代码.正如@Tomer所述,您也可以使用该[STAThread]属性以声明方式指定.

如果您发现主线程上发生异常,请回发并告知我们,也许我们可以提供更多帮助.异常时的堆栈跟踪可能有助于追踪问题.


如果你不想手动设置它,你也可以在线程方法上放置[STAThread]属性.

2> Sai Sherleka..:
function abc
{
            Thread t = new Thread(new ThreadStart(xyz));
            t.SetApartmentState(ApartmentState.STA);
            t.Start( );    
}
function xyz
{
 the code of Windows form..or whatever which is causing the error
}

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有