考慮到SO的這個question,其中調用了整個C#內存中的編譯器。如果只需要lexical and syntactic analyzing:將文本解析爲詞位流,請檢查它們並退出。是否可以在不編譯的情況下調用C#詞法/語法分析器?
是否有可能在System.CodeDom.Compiler當前版本中,如果不 - 會是什麼?
考慮到SO的這個question,其中調用了整個C#內存中的編譯器。如果只需要lexical and syntactic analyzing:將文本解析爲詞位流,請檢查它們並退出。是否可以在不編譯的情況下調用C#詞法/語法分析器?
是否有可能在System.CodeDom.Compiler當前版本中,如果不 - 會是什麼?
如果你可以使用單聲道,我相信你可以使用it has a C# parser/lexer。
這裏有一個鏈接來看看。至於MS C#團隊計劃做什麼,there is some talk在某種程度上使得C#編譯器變成了「服務」 - 但不清楚這意味着什麼或什麼時候會發生。
是的。 Microsoft C#團隊可能會在C#5.0中打開其編譯器,但這需要一段時間。 – 2010-04-09 21:02:54
雖然它可能看起來像代碼存儲器(CompilerParameters.GenerateInMemory)被編譯,這不是實際發生的情況。使用與Visual Studio中使用的編譯器相同的編譯器來編譯代碼(csc.exe)。它由CreateProcess啓動(很像Process.Start),並運行進程外將代碼編譯到臨時文件夾中的磁盤上的程序集。 GenerateInMemory選項調用Assembly.LoadFrom()來加載程序集。
你只需設定GenerateInMemory爲false得到一個語法檢查相媲美,並刪除OutputAssembly它完成之後。
雖然這聽起來有點倒退,它有巨大的好處是,這將不會把你的過程中的任何內存壓力。這會讓你一直持續到C#5.0發佈。
因此'GenerateInMemory = false'的速度更快,因爲它在成功構建之後不會將程序集加載到內存中? – abatishchev 2010-04-09 22:07:19
這是正確的。但我懷疑你會注意到。無論如何,你真的不想加載程序集,不能卸載它。 – 2010-04-09 22:44:48
非常感謝!我有一個使用C#CodeDom的項目,你給了非常有用的提示。首先,我認爲這個過程恰恰相反:程序集正在內存中生成並保存在磁盤上 – abatishchev 2010-04-11 10:10:22
不要復活一個已經死了的問題,但如果你仍然在嘗試這樣做,請查看Roslyn CTP。這非常棒。 – piebie 2011-12-06 21:40:05