web-dev-qa-db-fra.com

Utilisation de System.Dynamic dans Roslyn

J'ai modifié l'exemple fourni avec la nouvelle version de Roslyn publiée hier pour utiliser dynamic et ExpandoObject, mais je reçois une erreur de compilation qui ne me dit pas trop comment la réparer. L'erreur est:

(7,21): erreur CS0656: Le compilateur manquant est requis du membre 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Ne pouvez-vous pas encore utiliser la dynamique dans le nouveau compilateur? Comment puis-je réparer cela? Voici l'exemple que j'ai mis à jour:

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

Je pense que vous devriez faire référence à l'assembly Microsoft.CSharp.dll

216
Alberto

Spécifique à ASP.NET MVC:

Vous pouvez obtenir cette erreur dans un contrôleur MVC 6 si vous oubliez de mettre [FromBody] dans une méthode POST.

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

Le projet par défaut .NETCore inclut déjà la référence Microsoft.CSharp, mais vous obtenez à peu près le même message.

Avec [FromBody] ajouté, vous pouvez maintenant publier du JSON et simplement accéder dynamiquement aux propriétés :-)

7
Simon_Weaver

Vous pouvez également vouloir vérifier les propriétés de toutes vos références de projet . Assurez-vous que toute référence utilise .NET plus récent que 2.0. J'ai un projet qui faisait référence à un autre projet dans la même solution et qui devait reconstruire la dépendance à l'aide d'une nouvelle cible .NET Framework.

Voir ce post .

De plus, n'oubliez pas d'ajouter la référence Microsoft.CSharp à votre projet principal, comme l'a dit @ Alberto.

3
A.Clymer

Pour que le code fonctionne dans .Net Core 2.1, j'ai dû ajouter ces références à la compilation:

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),            
    }
);
2
Renzo Ciot

Si votre projet cible .Net Core ou .Net Standard, vous pouvez installer le package Microsoft.CSharp NuGet au lieu d’ajouter une référence pour résoudre cette erreur.

0
Kolappan Nathan