在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常

在使用C#的OpenFileDialog时遇到必须将线程设置为STA模式的问题。根据MSDN的解释,COM对象的交互需要线程在STA状态。文章通过示例展示了如何在创建新线程时设置ApartmentState属性为STA,以确保能够正确调用OLE组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近用C#搞一个项目,用到了openFileDialog,出现了如题这个问题,后来各种百度各种谷歌,找到了问题的根源。在MSDN中有描述:

       单元是进程内部具有相同线程访问要求的对象的逻辑容器。同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用。.NET Framework 不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源。由于 COM 类使用单元,因此公共语言运行库需要在 COM interop 的情况下调用 COM 对象时创建并初始化一个单元。托管线程可以创建并进入只允许有一个线程的单线程单元 (STA) 或者包含一个或多个线程的多线程单元 (MTA)。通过将线程的 ApartmentState 属性设置为 ApartmentState 枚举值之一,可以控制所创建的单元的类型。由于给定线程只能初始化 COM 单元一次,因此在第一次调用非托管代码之后就不能更改单元类型。

        例如:

          private void back_Click(object sender, EventArgs e)
          {

            Thread td = new Thread(delegate() { call(ref db, ref state,ref filename,ref length); });
            td.SetApartmentState(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值