Zmodyfikowałem przykład dołączony do nowej wersji Roslyn, która została wydana wczoraj, aby używać dynamiki i ExpandoObject, ale otrzymuję błąd kompilatora, którego nie jestem pewien, jak naprawić. Błąd:
(7,21): błąd CS0656: brak wymaganego elementu członkowskiego kompilatora „Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
Czy nie możesz jeszcze używać dynamiki w nowym kompilatorze? Jak mogę to naprawić? Oto przykład, który zaktualizowałem:
[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);
}
dynamic
wprowadzenia.Aby kod działał w .Net Core 2.1, musiałem dodać w kompilacji następujące odwołania:
źródło
Specyficzne dla ASP.NET MVC:
Można uzyskać ten błąd w MVC 6 kontrolera jeśli zapomnij umieścić
[FromBody]
wPOST
metodzie.Projekt domyślny .NETCore zawiera już
Microsoft.CSharp
odniesienie, ale otrzymujesz prawie taką samą wiadomość.Po
[FromBody]
dodaniu możesz teraz publikować JSON, a następnie dynamicznie uzyskiwać dostęp do właściwości :-)źródło
Możesz również chcieć sprawdzić właściwości wszystkich odniesień do projektu. Upewnij się, że wszelkie odwołania używają .NET nowszego niż 2.0. Mam projekt, który odwoływał się do innego projektu w tym samym rozwiązaniu i musiałem odbudować zależność przy użyciu nowszego elementu docelowego platformy .NET.
Zobacz ten post .
Nie zapomnij również dodać
Microsoft.CSharp
odniesienia do swojego głównego projektu, jak powiedział @Alberto.źródło
Jeśli projekt jest przeznaczony dla .Net Core lub .Net Standard, zamiast dodawać odwołanie, możesz zainstalować pakiet Microsoft.CSharp NuGet, aby rozwiązać ten błąd.
źródło