使用CodeDomProvider进行编译不允许使用C#或VB的新功能

时间:2008-12-19 00:42:04

标签: c# .net vb.net scripting

我正在使用CodeDomProvider,CompilerInfo和CompilerParameters在运行时编译一些C#和VB代码。它工作得很好,我真的希望能够为我的应用程序添加脚本支持,但它似乎只支持.NET 2.0语法。例如,C#不支持var关键字,VB中不支持If(bool,string,string)表达式。

我怎么能告诉它以3.5框架为目标?

2 个答案:

答案 0 :(得分:8)

好的,我从Anders Norås发现了一个很大的提示,即CSharpCodeProvider构造函数的构造函数需要一些选项,包括编译器版本。当我检查MSDN docs时,我发现在App.config文件中指定编译器选项更清晰。这是一个例子:

<system.codedom>
  <compilers>
    <compiler
      language="vb;vbs;visualbasic;vbscript"
      extension=".vb"
      type="Microsoft.VisualBasic.VBCodeProvider, System, 
        Version=2.0.3600.0, Culture=neutral, 
        PublicKeyToken=b77a5c561934e089"
      compilerOptions="/optimize"
      warningLevel="1" >
      <providerOption
        name="CompilerVersion"
        value="v3.5" />
    </compiler>
    <compiler
      language="c#;cs;csharp"
      extension=".cs"
      type="Microsoft.CSharp.CSharpCodeProvider, System, 
        Version=2.0.3600.0, Culture=neutral, 
        PublicKeyToken=b77a5c561934e089"
      compilerOptions="/optimize"
      warningLevel="1" >
      <providerOption
        name="CompilerVersion"
        value="v3.5" />
    </compiler>
  </compilers>
</system.codedom>

我唯一的失望是现在我从CodeDomProvider.GetAllCompilerInfo()获得了每个编译器的两个版本。配置文档说App.config应该覆盖machine.config设置,但我得到了两者。到目前为止,App.config总是在machine.config之后,所以我只是让后面的那些覆盖了之前的那些。有谁知道如何避免重复?

答案 1 :(得分:7)

不知道你在app.config的用途,但是这里你可以告诉它如何使用3.5框架。

var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });

http://blogs.msdn.com/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx