использование системы.Динамика в Рослине


Я изменил пример, который поставляется с новой версией 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 86

4 ответа:

Я думаю, что вы должны ссылаться на Microsoft.CSharp.dll сборка

вы можете получить эту ошибку в контроллере 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),            
    }
);