2009-07-29 8 views
12

मेरे पास CSharpCodeProvider के आसपास एक रैपर के रूप में निम्न मानक, काफी मानक कोड है। यह वर्ग बहुत अच्छी तरह से काम करता है, और ठीक काम करता है, इत्यादि। लेकिन, इस तथ्य के बावजूद कि मेरा आवेदन .NET 3.5 के खिलाफ बनाया गया है और इस संकलन के दौरान v3.5 असेंबली का संदर्भ दे रहा है, मुझे अभी भी किसी भी तक पहुंच नहीं है लैम्ब्डा या ऑटो-गुणों जैसे अतिरिक्त अच्छे सी # 3.5 वाक्यविन्यास का। क्या यह काम करने के लिए कोई रास्ता है?CSharpCodeProvider .NET 2.0 पर फंस गया प्रतीत होता है, मुझे नई सुविधाएं कैसे मिलेंगी?

मैं इस धारणा के तहत था कि यह वर्ग सिर्फ csc.exe के आसपास लपेट गया है, एक ऐसा विचार जो मेरी फ़ायरवॉल द्वारा पुष्टि की जाएगी (मेरा एप्लिकेशन csc.exe तक पहुंचने का प्रयास करता है)। शायद मुझे कुछ options.CompilerOptions सेट करने की आवश्यकता है?

protected virtual void Compile() 
{ 
    Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider(); 

    CompilerParameters options = new CompilerParameters(); 
    options.GenerateExecutable = false; 
    options.GenerateInMemory = true; 
    options.IncludeDebugInformation = true; 

    foreach (string s in this.ReferencedAssemblies) 
    { 
     options.ReferencedAssemblies.Add(s); 
    } 

    CompilerResults result; 
    string source = this.CodeTemplate; 

    // [snip] Do some manipulation to fill in the template with values. 

    result = csProvider.CompileAssemblyFromSource(options, source); 

    this.HasErrors = result.Errors.HasErrors; 
    this.Errors = new CompilerError[result.Errors.Count]; 
    result.Errors.CopyTo(Errors, 0); 

    if (HasErrors && ThrowOnErrors) 
     throw new InvalidProgramException("The code currently stored in the " + this.GetType() + " cannot be compiled."); 
    else if (HasErrors) 
     return; 
    this.CompiledAssembly = result.CompiledAssembly; 
} 

संपादित करें:

मैं mscorlib, System.Core, System.Text और इस समय अपने ही विधानसभाओं में से एक के लिए संदर्भ की है।

+0

3.5 2.0 फ्रेमवर्क पर बनाया गया है। –

उत्तर

25

(एक शब्दकोश में) एक संकलक झंडा है कि आप निर्माता में पारित कर सकते हैं नहीं है:

Dictionary<string,string> options = new Dictionary<string,string> 
{ 
    { "CompilerVersion", "v3.5" } 
}; 

var compiler = new CSharpCodeProvider(options); 

है वैसे भी मेरे लिए क्या काम किया है यही कारण है, ...

+0

+1: मैंने फ्रेमवर्क संस्करणों के लिए enum मानों के साथ इसके लिए एक सरल रैपर लिखा ताकि मैं निर्दिष्ट कर सकूं कि ऐप के कौन से हिस्से संकलक का समर्थन करते हैं। –

+0

इस पुराने उत्तर को खोजने के लिए Google की स्तुति करें। मुझे एक टन बचाया, क्योंकि यह वास्तव में एमएसडीएन में बेहतर दस्तावेज किया जा सकता है। +1 –

0

संदर्भित असेंबली में, System.Core के संदर्भ को जोड़ने का प्रयास करें। इससे हो जाना चाहिए। वहां 3.5 की बहुत सारी कार्यक्षमता है। यदि ऐसा नहीं होता है, तो अपने वर्तमान प्रोजेक्ट के लिए बिल्ड बिल्ड गुण बनाएं और जांचें कि आपको कौन सी अन्य असेंबली लोड हो सकती हैं।

+1

मेरा संपादन देखें, लेकिन क्या संदर्भ वास्तव में संकलक व्यवहार में अंतर डाल देंगे? –

+3

नहीं, वे नहीं करेंगे। आप सी # 3.0 भाषा विशेषताओं को चाहते हैं, जरूरी नहीं (.NET Framework 3.5 क्लास लाइब्रेरी। किसी को दूसरे की आवश्यकता नहीं है। – Lucas

संबंधित मुद्दे