2010-04-09 63 views
4

考慮到SO的這個question,其中調用了整個C#內存中的編譯器。如果只需要lexical and syntactic analyzing:將文本解析爲詞位流,請檢查它們並退出。是否可以在不編譯的情況下調用C#詞法/語法分析器?

是否有可能在System.CodeDom.Compiler當前版本中,如果不 - 會是什麼?

+0

不要復活一個已經死了的問題,但如果你仍然在嘗試這樣做,請查看Roslyn CTP。這非常棒。 – piebie 2011-12-06 21:40:05

回答

6

如果你可以使用單聲道,我相信你可以使用it has a C# parser/lexer

這裏有一個鏈接來看看。至於MS C#團隊計劃做什麼,there is some talk在某種程度上使得C#編譯器變成了「服務」 - 但不清楚這意味着什麼或什麼時候會發生。

+1

是的。 Microsoft C#團隊可能會在C#5.0中打開其編譯器,但這需要一段時間。 – 2010-04-09 21:02:54

1

雖然它可能看起來像代碼存儲器(CompilerParameters.GenerateInMemory)被編譯,這不是實際發生的情況。使用與Visual Studio中使用的編譯器相同的編譯器來編譯代碼(csc.exe)。它由CreateProcess啓動(很像Process.Start),並運行進程外將代碼編譯到臨時文件夾中的磁盤上的程序集。 GenerateInMemory選項調用Assembly.LoadFrom()來加載程序集。

你只需設定GenerateInMemory爲false得到一個語法檢查相媲美,並刪除OutputAssembly它完成之後。

雖然這聽起來有點倒退,它有巨大的好處是,這將不會把你的過程中的任何內存壓力。這會讓你一直持續到C#5.0發佈。

+0

因此'GenerateInMemory = false'的速度更快,因爲它在成功構建之後不會將程序集加載到內存中? – abatishchev 2010-04-09 22:07:19

+0

這是正確的。但我懷疑你會注意到。無論如何,你真的不想加載程序集,不能卸載它。 – 2010-04-09 22:44:48

+0

非常感謝!我有一個使用C#CodeDom的項目,你給了非常有用的提示。首先,我認爲這個過程恰恰相反:程序集正在內存中生成並保存在磁盤上 – abatishchev 2010-04-11 10:10:22

相關問題