Використання System.Dynamic у Росліні


96

Я модифікував приклад, який постачається з новою версією Roslyn, яка була випущена вчора, щоб використовувати Dynamic та ExpandoObject, але я отримую помилку компілятора, яку я не знаю, як виправити. Помилка:

(7,21): помилка CS0656: Відсутній необхідний член компілятора 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Ви ще не можете використовувати динаміку в новому компіляторі? Як я можу це виправити? Ось приклад, який я оновив:

[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);
}

Відповіді:


219

Я думаю, що вам слід посилатися на Microsoft.CSharp.dllзбірку


3
Так, це щось, що потрібно з моменту dynamicвведення.
khellang

19
І якби корпорація Майкрософт видала повідомлення про помилку, яке повідомляло, що це так, це значно полегшило б роботу.
kjbartel

1
Я не знаю, чи це вирішило проблему чи ні, але я додав <addpacepace = "Microsoft.CSharp" /> у свій вузол Views / Web.config <namespaces>. Помилка компілятора знищена.
Дон Роллінг

3
FWIW, додаючи Microsoft.CSharp.dll, означає var scriptOptions = ScriptOptions.Default.WithReferences ("Microsoft.CSharp"), тобто видаліть dll. Тупив мене на кілька хвилин :)
Jon H

@JonH, тож ми повинні додати цей рядок до AssemblyInfo.cs або десь замість посилання на dll?
NH.

9

Щоб змусити код працювати в .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),            
    }
);

Ви можете піти з System.Linq.Expressions, System.Private.CoreLib, System.Runtime і Microsoft.CSharp, все як рядки
Саймон Мур'є

7

Спеціально для ASP.NET MVC:

Ви можете отримати цю помилку в 6 контролера MVC , якщо ви забули поставити [FromBody]в POSTметоді.

    [HttpPost("[action]")]
    public void RunReport([FromBody]dynamic report)
    {
        ...
    }

Проект за замовчуванням .NETCore вже включає Microsoft.CSharpпосилання, але ви отримуєте майже те саме повідомлення.

Після [FromBody]додавання тепер ви можете розміщувати JSON, а потім просто динамічно отримувати доступ до властивостей :-)


Вважав, що це не стосується оригінального запитання, опублікованого з 2014 року (хоча хотів визнати, що це було корисним.) Не був впевнений, що диктує SO етикет у такій ситуації.
tj

Справедливий момент :) Я щойно додав його сюди, тому що це здавалося настільки неясним, і це вдало
збігалося

4

Ви також можете перевірити властивості всіх посилань на ваш проект. Переконайтеся, що будь-яке посилання використовує .NET, новішу за версію 2.0. У мене є проект, який посилався на інший проект у тому самому рішенні, і йому довелося відновити залежність, використовуючи нову ціль .NET framework.

Дивіться цю публікацію .

Крім того, не забудьте додати Microsoft.CSharpпосилання на ваш основний проект, як сказав @Alberto.


1

Якщо ваш проект націлений на .Net Core або .Net Standard, то замість додавання посилання ви можете встановити пакет Microsoft.CSharp NuGet, щоб вирішити цю помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.