为什么要加上tr.SetApartmentState(ApartmentState.STA);这句。否则会报下面那个错!
请详细回答!
using System;using System.Windows.Forms;using System.Threading;namespace WindowsFormsApplication4{ public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } private Thread tr; void Form1_Load(object sender, EventArgs e) { tr = new Thread(new ThreadStart(Do)); tr.SetApartmentState(ApartmentState.STA); tr.IsBackground = true; tr.Start(); } private void Do() { System.Windows.Forms.SaveFileDialog s = new SaveFileDialog(); if (s.ShowDialog() == System.Windows.Forms.DialogResult.OK) { MessageBox.Show("123"); } //在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。 //请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。 } }}
22 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
@KeVinDurant:
[SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected abstract bool RunDialog(IntPtr hwndOwner);
富国沪深
TA贡献1790条经验 获得超9个赞
@KeVinDurant:
[SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected abstract bool RunDialog(IntPtr hwndOwner);下面可能是C++写的了。有没有调用Win32 API和SAT都是根据你的错误信息推测。想看真相,去找clr源码下载来看看
慕姐8265434
TA贡献1813条经验 获得超2个赞
@KeVinDurant: 推测。因为这种对话框本身就可能是之前留下来的组件啊,不会说每个组件都C#重新开发一次。喜欢研究的话把clr源码下下来研究下
慕运维8079593
TA贡献1876条经验 获得超5个赞
@滴答的雨: 调用Win32内部方法,该方法肯定访问了现成的OLE组件,且这个组件是以SAT模型公开的...
这句怎么解释。。从哪里可以看出来?
红颜莎娜
TA贡献1842条经验 获得超12个赞
能否说详细点
System.Windows.Forms.SaveFileDialog s = new SaveFileDialog();这个控件是系统自带的。不是第三方哦。。。
- 22 回答
- 0 关注
- 734 浏览
添加回答
举报
0/150
提交
取消