代码之家  ›  专栏  ›  技术社区  ›  Don Kirkby

使用codedomProvider编译不允许使用C或VB的新功能

  •  6
  • Don Kirkby  · 技术社区  · 16 年前

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

    我如何才能告诉它以3.5框架为目标?

    2 回复  |  直到 16 年前
        1
  •  8
  •   Don Kirkby    16 年前

    好吧,我在这里发现了一个很大的提示 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之后,所以我只让后面的那个覆盖前面的那个。有人知道如何避免复制吗?

        2
  •  7
  •   Cwoo    16 年前

    不确定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

    推荐文章