использование системы.Динамика в Рослине
Я изменил пример, который поставляется с новой версией Roslyn, которая была выпущена вчера, чтобы использовать dynamic и ExpandoObject, но я получаю ошибку компилятора, которую я не уверен, как исправить. Ошибка:
(7,21): ошибка CS0656: отсутствует необходимый элемент компилятора 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Создать'
вы еще не можете использовать динамику в новом компиляторе? Как я могу это исправить? Вот пример того, что я обновлено:
[TestMethod]
public void EndToEndCompileAndRun()
{
var text = @"using System.Dynamic;
public class Calculator
{
public static object Evaluate()
{
dynamic x = new ExpandoObject();
x.Result = 42;
return x.Result;
}
}";
var tree = SyntaxFactory.ParseSyntaxTree(text);
var compilation = CSharpCompilation.Create(
"calc.dll",
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
syntaxTrees: new[] {tree},
references: new[] {new MetadataFileReference(typeof (object).Assembly.Location), new MetadataFileReference(typeof (ExpandoObject).Assembly.Location)});
Assembly compiledAssembly;
using (var stream = new MemoryStream())
{
var compileResult = compilation.Emit(stream);
compiledAssembly = Assembly.Load(stream.GetBuffer());
}
Type calculator = compiledAssembly.GetType("Calculator");
MethodInfo evaluate = calculator.GetMethod("Evaluate");
string answer = evaluate.Invoke(null, null).ToString();
Assert.AreEqual("42", answer);
}
4 ответа:
вы можете получить эту ошибку в контроллере MVC 6, Если вы забыли поставить
[FromBody]
наPOST
метод.[HttpPost("[action]")] public void RunReport([FromBody]dynamic report) { ... }
The .Проект NETCore по умолчанию уже включает
Microsoft.CSharp
ссылка, но вы получаете почти то же самое сообщение.С
[FromBody]
добавлено теперь вы можете опубликовать JSON, а затем просто динамически получить доступ к свойствам : -)
вы также можете проверить свойства всех ссылок на проект. Убедитесь, что любые ссылки, используя .Чистая новее, чем 2.0. У меня есть проект, который ссылался на другой проект в том же решении и должен был перестроить зависимость, используя более новую цель .NET framework.
посмотреть этот post.
кроме того, не забудьте добавить
Microsoft.CSharp
ссылка на вас основной проект, как @Alberto сказал.
чтобы код работал в .Net Core 2.1 мне пришлось добавить эти ссылки в компиляцию:
var compilation = CSharpCompilation.Create( "calc.dll", options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary), syntaxTrees: new[] {tree}, references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(typeof(ExpandoObject).Assembly.Location), MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.CSharp")).Location), MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("netstandard")).Location), MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("mscorlib")).Location), MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location), } );