Компиляция с CodeDomProvider не позволяет новые функции C # или VB - PullRequest
6 голосов
/ 19 декабря 2008

Я компилирую некоторый код C # и VB во время выполнения, используя CodeDomProvider, CompilerInfo и CompilerParameters. Он прекрасно работает, и мне действительно нравится иметь возможность добавлять поддержку сценариев в мое приложение, но кажется, что он поддерживает только синтаксис .NET 2.0. Например, ключевое слово var не поддерживается в C #, а выражение If (bool, string, string) не поддерживается в VB.

Как мне настроить таргетинг на фреймворк 3.5?

Ответы [ 2 ]

8 голосов
/ 19 декабря 2008

ОК, я обнаружил здесь большой намек от Андерс Норас , что есть конструктор для конструктора 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, поэтому я просто позволю более поздним переопределять предыдущие. Кто-нибудь знает, как избежать дублирования?

7 голосов
/ 19 декабря 2008

Не уверен, куда вы идете с app.config, но вот как вы можете сказать ему использовать 3.5 framework.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...