Как я могу указать T4 (текстовые шаблоны) для использования C# 4.0 в VS2010?
Мне нужно указать мой T4 для использования C# 4.0, для рендеринга моих файлов tt? Я пытался с помощью
<#@ template language="C#v4.0" debug="true" #>
Но когда я использую динамическую переменную, как это
dynamic x=10;
Write(x.ToString());
Я получаю эти ошибки
Error 2 Compiling transformation: Predefined type 'Microsoft.CSharp.RuntimeBinder.CSharpSetMemberBinder' is not defined or imported e:\projects\DynamicModel\DynamicModel\ModelGenerator.tt 1 1
Error 3 Compiling transformation: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder..ctor' e:\projects\DynamicModel\DynamicModel\ModelGenerator.tt 1 1
Error 4 Compiling transformation: Missing compiler required member 'System.Runtime.CompilerServices.CallSite.Create' e:\projects\DynamicModel\DynamicModel\ModelGenerator.tt 1 1
Error 5 Compiling transformation: One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? e:\Projects\DynamicModel\DynamicModel\ModelGenerator.tt 7 8
Error 6 A namespace cannot directly contain members such as fields or methods e:\projects\DynamicModel\DynamicModel\ModelGenerator.cs 1 1 DynamicModel
Также обратите внимание, что я использую TextTemplatingFileGenerator, а не шаблоны препроцессора.
2 ответа
Выяснил, что вы должны также указать правильные сборки.
Добавление этого гарантирует, что вы используете C# 4.0.
<#@ template language="C#" debug="true" #>
<#@ output extension=".txt" #>
<#@ Assembly Name="System.Core, Version=4.0.0.0, Culture=neutral" #>
<#@ Assembly Name="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral" #>
Однако по какой-то причине во время преобразования t4 динамическая диспетчеризация все еще не работает с T4, задаваясь вопросом, почему. С T4 он выдает ошибку во время выполнения, тот же код делает добро прямо из файла CS.
Я считаю, что по умолчанию движок T4 может использовать только 4.0, хотя я бы позаботился о том, чтобы любые библиотеки DLL, на которые вы ссылаетесь, были правильными для вашей ошибки.