為什么要加上tr.SetApartmentState(ApartmentState.STA);這句。否則會(huì)報(bào)下面那個(gè)錯(cuò)!
請?jiān)敿?xì)回答!
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");??????????? }??????????? //在可以調(diào)用 OLE 之前,必須將當(dāng)前線程設(shè)置為單線程單元(STA)模式。??????????? //請確保您的 Main 函數(shù)帶有 STAThreadAttribute 標(biāo)記。 只有將調(diào)試器附加到該進(jìn)程才會(huì)引發(fā)此異常。??????? }??? }}
22 回答

料青山看我應(yīng)如是
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
@KeVinDurant:?reflector.exe能看到的就是C#開發(fā)的,當(dāng)你發(fā)現(xiàn)這工具看不到的函數(shù)就是其他語言開發(fā)的

慕桂英3389331
TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
@滴答的雨: 看到了。調(diào)用了外部函數(shù)。。怎么跟調(diào)用win32 api不同的。。??沒有看到引入命名空間什么之類的???

收到一只叮咚
TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
@KeVinDurant:?
[SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected abstract bool RunDialog(IntPtr hwndOwner);

鳳凰求蠱
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
@滴答的雨: 但這樣也不能說明SaveFileDialog不是用c#寫的吧。。能舉例其中哪個(gè)方法是調(diào)用了C++或者delphi的嗎??

千巷貓影
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
@KeVinDurant:??reflector.exe能看到的就是C#開發(fā)的,當(dāng)你發(fā)現(xiàn)這工具看不到的函數(shù)就是其他語言開發(fā)的

富國滬深
TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
@KeVinDurant:?
[SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
protected abstract bool RunDialog(IntPtr hwndOwner);下面可能是C++寫的了。有沒有調(diào)用Win32 API和SAT都是根據(jù)你的錯(cuò)誤信息推測。想看真相,去找clr源碼下載來看看

12345678_0001
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
多線程訪問了控件就會(huì)出現(xiàn)這個(gè)問題,
請使用BeginInvoke或Invoke方法

慕姐8265434
TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
@KeVinDurant: 推測。因?yàn)檫@種對話框本身就可能是之前留下來的組件啊,不會(huì)說每個(gè)組件都C#重新開發(fā)一次。喜歡研究的話把clr源碼下下來研究下

慕運(yùn)維8079593
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
@滴答的雨:?調(diào)用Win32內(nèi)部方法,該方法肯定訪問了現(xiàn)成的OLE組件,且這個(gè)組件是以SAT模型公開的...
?
這句怎么解釋。。從哪里可以看出來?

紅顏莎娜
TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
能否說詳細(xì)點(diǎn)
System.Windows.Forms.SaveFileDialog s = new SaveFileDialog();這個(gè)控件是系統(tǒng)自帶的。不是第三方哦。。。

素胚勾勒不出你
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
這是你所要訪問的第三方組件就是“單線程單元模型”。所以你訪問他你的線程也應(yīng)該是單線程單元模式

30秒到達(dá)戰(zhàn)場
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
你換成System.Windows.Forms.TextBox t = new TextBox();就不會(huì)啦。。根本性不是這個(gè)原因...
- 22 回答
- 0 關(guān)注
- 790 瀏覽
添加回答
舉報(bào)
0/150
提交
取消