CSC停止问题的解决

博客介绍了C#自动编译时的问题。使用XmlSerializer或codeDom自动编译会启动C#编译器csc.exe,在亚洲版win xp中,csc会启动ConIme支持多语言字符,但有时启动失败,会等待10分钟才返回异常。解决办法是屏蔽ConIme,还给出了相关代码操作说明。

涉及到自动编译的时候,比如使用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了。

大致代码如下:

 1None.giftry
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif    RegistryKey hkcu = Registry.CurrentUser  ;
 4InBlock.gif    RegistryKey skconsole = hkcu.OpenSubKey ( "Console",true ) ;
 5InBlock.gif       
 6InBlock.gif    if (skconsole.GetValue("LoadConIme").Equals(1) )
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 8InBlock.gif        skconsole.SetValue("LoadConIme",0);
 9ExpandedSubBlockEnd.gif    }

10InBlock.gif    hkcu.Close();
11InBlock.gif    skconsole.Close();
12InBlock.gif    // コンパイル
13InBlock.gif    CompilerResults cret = compiler.CompileAssemblyFromFileBatch( cprm, filenames);
14InBlock.gif    
15InBlock.gif    return cret;
16InBlock.gif
17ExpandedBlockEnd.gif}
 //end try 
18None.gifcatch(Exception e)
19ExpandedBlockStart.gifContractedBlock.gifdot.gif{
20InBlock.gif    throw e;
21ExpandedBlockEnd.gif}

22None.giffinally
23ExpandedBlockStart.gifContractedBlock.gifdot.gif{
24InBlock.gif    RegistryKey hkcu = Registry.CurrentUser  ;
25InBlock.gif    RegistryKey skconsole = hkcu.OpenSubKey ( "Console",true ) ;
26InBlock.gif    if (skconsole.GetValue("LoadConIme").Equals(0)  )
27ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
28InBlock.gif        skconsole.SetValue("LoadConIme",1);
29ExpandedSubBlockEnd.gif    }

30InBlock.gif    hkcu.Close();
31InBlock.gif    skconsole.Close();
32InBlock.gif
33ExpandedBlockEnd.gif}

代码简单说明如下:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值