Roslyn में System.Dynamic का उपयोग करना


96

मैंने रोसलिन के नए संस्करण के साथ आने वाले उदाहरण को संशोधित किया जो कि गतिशील और एक्सपेंडेओबजेक्ट का उपयोग करने के लिए कल जारी किया गया था लेकिन मुझे एक संकलक त्रुटि मिल रही है जो मुझे ठीक नहीं है कि कैसे ठीक करें। त्रुटि है:

(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शुरू करने के बाद से आवश्यक है ।
khellang

19
और अगर Microsoft ने एक त्रुटि संदेश दिया जो आपको बताया कि यह चीजों को इतना आसान बना देगा।
kjbartel

1
मुझे नहीं पता कि यह समस्या ठीक हुई या नहीं, लेकिन मैंने अपने दृश्य / Web.config <namepaces> नोड में <namepace = "Microsoft.CSharp" /> को जोड़ा। कंपाइलर त्रुटि अब गई है।
डॉन रोलिंग

3
FWIW में Microsoft.CSharp.dll का अर्थ है var scriptOptions = ScriptOptions.Default.WithReferences ("Microsoft.CSharp") अर्थात dll छोड़ना। कुछ मिनटों के लिए मुझे रोक दिया :)
जॉन एच।

@JonH तो हमें dll को संदर्भित करने के बजाय असेंबलीInfo.cs या कहीं और उस पंक्ति को जोड़ना चाहिए ?
एनएच।

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.PStreet.CoreLib, System.Runtime और Microsoft.CSharp के साथ सभी तार के रूप में दूर जा सकते हैं
शमौन Mourier

7

ASP.NET MVC विशिष्ट:

यदि आप [FromBody]किसी POSTविधि में रखना भूल जाते हैं, तो आपको यह त्रुटि MVC 6 नियंत्रक में मिल सकती है ।

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

.NETCore डिफ़ॉल्ट प्रोजेक्ट में पहले से ही Microsoft.CSharpसंदर्भ शामिल है लेकिन आपको एक ही संदेश बहुत मिलता है।

[FromBody]जोड़ा के साथ अब आप JSON पोस्ट कर सकते हैं और फिर गतिशील रूप से गुणों को एक्सेस कर सकते हैं :-)


यह 2014 से पोस्ट किए गए मूल प्रश्न पर लागू नहीं हुआ (हालांकि यह स्वीकार करना चाहता था कि यह मददगार था।) यकीन नहीं था कि एसओ शिष्टाचार ऐसी स्थिति में क्या निर्धारित करता है।
tj

फेयर पॉइंट :) मैंने इसे सिर्फ इसलिए जोड़ा क्योंकि यह बहुत अस्पष्ट लग रहा था और यह उस त्रुटि के लिए एक अच्छा मैच था
सिमोन_विएवर

4

आप अपने सभी प्रोजेक्ट संदर्भों के गुणों की जांच करना चाहते हैं। सुनिश्चित करें कि कोई संदर्भ 2.0 की तुलना में .NET नए का उपयोग कर रहा है। मेरे पास एक परियोजना है जो एक ही समाधान में एक और परियोजना को संदर्भित कर रही थी और नए .NET फ्रेमवर्क लक्ष्य का उपयोग करके निर्भरता का पुनर्निर्माण करना था।

इस पोस्ट को देखें ।

इसके अलावा, Microsoft.CSharp@Alberto ने कहा कि आप मुख्य परियोजना के लिए संदर्भ जोड़ने के लिए मत भूलना ।


1

यदि आपका प्रोजेक्ट .Net Core या .Net Standard को टारगेट कर रहा है, तो संदर्भ जोड़ने के बजाय आप इस त्रुटि को हल करने के लिए Microsoft.CSharp NuGet पैकेज स्थापित कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.