【问题标题】:Is it possible to call C# lexical/syntactic analyzers without compilation?是否可以在不编译的情况下调用 C# 词法/句法分析器?
【发布时间】:2010-04-09 20:59:39
【问题描述】:

考虑到 SO 的 question,其中调用了整个 C# 内存编译器。当只需要lexical and syntactic analyzing 时:将文本解析为词位流,检查它们并退出。

在当前版本的System.CodeDom.Compiler 中是否有可能,如果没有 - 会吗?

【问题讨论】:

  • 不要复活一个死问题,但如果您仍在尝试这样做,请查看 Roslyn CTP。真是太棒了。

标签: c# .net codedom lexical-analysis compiler-as-a-service


【解决方案1】:

如果你会用Mono,我相信it has a C# parser/lexer你也许可以用。

这是一个可以查看的链接。至于 MS C# 团队计划做什么,there is some talk 在某个时候将 C# 编译器变成“服务”——但目前尚不清楚这意味着什么或何时会发生。

【讨论】:

  • 是的。 Microsoft C# 团队可能会在 C# 5.0 中打开他们的编译器,但这需要一段时间。
【解决方案2】:

虽然代码看起来像是在内存中编译的 (CompilerParameters.GenerateInMemory),但实际情况并非如此。与 Visual Studio 中使用的编译器相同的编译器用于编译代码 (csc.exe)。它由 CreateProcess 启动(很像 Process.Start)并在进程外运行以将代码编译为磁盘上临时文件夹中的程序集。 GenerateInMemory 选项调用 Assembly.LoadFrom() 来加载程序集。

您只需将 GenerateInMemory 设置为 false 并在完成后删除 OutputAssembly 即可获得相当于语法检查的功能。

虽然这听起来有点倒退,但它的巨大好处是不会对您的进程造成任何内存压力。这会让你在 C# 5.0 发布之前一直坚持下去。

【讨论】:

  • 所以GenerateInMemory=false 更快,因为它不会在成功构建后将程序集加载到内存中?
  • 没错。我怀疑你会注意到。你真的不想加载程序集,不能卸载它。
  • 非常感谢!我有一个使用 C# CodeDom 的项目,您提供了非常有用的提示。首先我认为这个过程完全相反:程序集是在内存中生成并保存在磁盘上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多