RoslynでのSystem.Dynamicの使用


96

昨日リリースされた新しいバージョンの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);
}

回答:


219

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


3
はい、これはdynamicが導入されてから必要なものです。
ケラン14

19
そして、もしマイクロソフトがあなたにこれを告げるエラーメッセージを出せば、物事はとても簡単になります。
kjbartel

1
これで問題が解決したかどうかはわかりませんが、<add namespace = "Microsoft.CSharp" />をViews / Web.config <namespaces>ノードに追加しました。コンパイラエラーはなくなりました。
Don Rolling

3
FWIWがMicrosoft.CSharp.dllを追加するということは、var scriptOptions = ScriptOptions.Default.WithReferences( "Microsoft.CSharp")つまりDLLをドロップすることを意味します。数分間私を困らせました:)
Jon H

@JonHなので、dllを参照する代わりに、AssemblyInfo.csまたはどこかその行を追加する必要がありますか?
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をすべて文字列として使用して回避できます
Simon

7

ASP.NET MVC固有:

あなたが置くことを忘れた場合は、MVC 6コントローラでこのエラーを取得することができます[FromBody]POSTする方法。

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

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

では[FromBody]追加あなたは今JSONを投稿してからちょうど動的プロパティにアクセスすることができます:-)


それが2014年から投稿された元の質問には適用されないことを理解しました(ただし、それが役に立ったことを認めたいと思いました)。SOのエチケットがそのような状況でどのように指示するかはわかりませんでした。
tj

公正なポイント:)非常に不明瞭に見え、これがそのエラーに適しているため、ここに追加しました
Simon_Weaver

4

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

この投稿を参照してください。

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.