昨日リリースされたRoslynの新しいバージョンに付属するサンプルを変更して、ダイナミックおよび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);
}
Microsoft.CSharp.dll
アセンブリを参照する必要があると思います
ASP.NET MVC固有:
[FromBody]
をPOST
メソッドに入れるのを忘れると、MVC 6コントローラーでこのエラーが発生する可能性があります。
[HttpPost("[action]")]
public void RunReport([FromBody]dynamic report)
{
...
}
.NETCoreのデフォルトプロジェクトには既にMicrosoft.CSharp
参照が含まれていますが、ほぼ同じメッセージが表示されます。
[FromBody]
を追加すると、JSONを投稿して、プロパティに動的にアクセスできるようになりました:-)
.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),
}
);
すべてのプロジェクト参照のプロパティを確認することもできます。参照が2.0より新しい.NETを使用していることを確認してください。同じソリューション内の別のプロジェクトを参照しているプロジェクトがあり、新しい.NETフレームワークターゲットを使用して依存関係を再構築する必要がありました。
こちらをご覧ください post 。
また、@ Albertoが言ったように、メインプロジェクトにMicrosoft.CSharp
参照を追加することを忘れないでください。
プロジェクトが.Net Coreまたは.Net Standardをターゲットにしている場合、参照を追加する代わりに Microsoft.CSharp NuGetパッケージをインストールしてこのエラーを解決できます。