web-dev-qa-db-ja.com

RoslynでSystem.Dynamicを使用する

昨日リリースされた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);
}
94
Rush Frisby

Microsoft.CSharp.dllアセンブリを参照する必要があると思います

219
Alberto

ASP.NET MVC固有:

[FromBody]POSTメソッドに入れるのを忘れると、MVC 6コントローラーでこのエラーが発生する可能性があります。

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

.NETCoreのデフォルトプロジェクトには既にMicrosoft.CSharp参照が含まれていますが、ほぼ同じメッセージが表示されます。

[FromBody]を追加すると、JSONを投稿して、プロパティに動的にアクセスできるようになりました:-)

7
Simon_Weaver

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

すべてのプロジェクト参照のプロパティを確認することもできます。参照が2.0より新しい.NETを使用していることを確認してください。同じソリューション内の別のプロジェクトを参照しているプロジェクトがあり、新しい.NETフレームワークターゲットを使用して依存関係を再構築する必要がありました。

こちらをご覧ください post

また、@ Albertoが言ったように、メインプロジェクトにMicrosoft.CSharp参照を追加することを忘れないでください。

3
A.Clymer

プロジェクトが.Net Coreまたは.Net Standardをターゲットにしている場合、参照を追加する代わりに Microsoft.CSharp NuGetパッケージをインストールしてこのエラーを解決できます。

0
Kolappan Nathan