CSC停止问题的解决
涉及到自動編譯的時候,比如使用XmlSerializer Xml的序列化和反序列化或codeDom的自動編譯的方法(CompileAssemblyFromBatch()等)使用的時候,會啟動C#的編譯器csc.exe, 由于在亞洲版的win xp操作系統中,特有的ConIme.exe,所以csc內部中有啟動ConIme的功能,為了其支持輸入如漢字,和日本語,韓國語的字符。但是啟動過程中會有ConIme啟動失敗的時候,此處原因未明(ms也沒有個說法),會在此處等上10分鐘,然后csc才會接到timeout的異常而返回。
根據ms的說法,解決方法是,一個是不用csc如果xml序列化的時候,可以不用call csc.exe but 如果真的要自動編譯一個C#文件,那就逃也逃不掉csc了。這時候要做的就是屏蔽ConIme,不讓其啟動,這樣csc就可以擺脫那個萬一的10分鐘的deadLock了。
大致代碼如下:
?2{
?3????RegistryKey?hkcu?=?Registry.CurrentUser??;
?4????RegistryKey?skconsole?=?hkcu.OpenSubKey?(?"Console",true?)?;
?5???????
?6????if?(skconsole.GetValue("LoadConIme").Equals(1)?)
?7????{
?8????????skconsole.SetValue("LoadConIme",0);
?9????}
10????hkcu.Close();
11????skconsole.Close();
12????//?コンパイル
13????CompilerResults?cret?=?compiler.CompileAssemblyFromFileBatch(?cprm,?filenames);
14????
15????return?cret;
16
17}?//end?try?
18catch(Exception?e)
19{
20????throw?e;
21}
22finally
23{
24????RegistryKey?hkcu?=?Registry.CurrentUser??;
25????RegistryKey?skconsole?=?hkcu.OpenSubKey?(?"Console",true?)?;
26????if?(skconsole.GetValue("LoadConIme").Equals(0)??)
27????{
28????????skconsole.SetValue("LoadConIme",1);
29????}
30????hkcu.Close();
31????skconsole.Close();
32
33}
代碼簡單說明如下:
1.opensubkey("Console",true)的第二個參數要是真,否則不能修改其keyvalue.
2.修改了keyvalue后,要close()這樣才能有效。總開著也覺得不舒服吧?
3.要finally中恢復你修改的keyvalue.這是因為將loadConIme的value改為0之后,再Cmd Console中中文輸入法等亞洲系列的ConIme將無法啟動,所以只在你需要的時候屏蔽一下,用完了總是要還的。(出來混總是要還的。)
轉載于:https://www.cnblogs.com/Bluse/archive/2005/09/24/243268.html
總結
以上是生活随笔為你收集整理的CSC停止问题的解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D学习之射箭小游戏
- 下一篇: .NetCore基于SignalR、Re