2016-02-29 3 views
5

दोनों के संदर्भ हैं, मैं गतिशील रूप से एक क्लास का निर्माण कर रहा हूं जो Microsoft.OData.Client का उपयोग करता है इस लाइब्रेरी में mscorlib 2.0.5.0 दोनों के संदर्भ हैं (i पीसीएल अनुमान लगाएं) और 4.0.0.0। enter image description hereकॉन्फ़्रेंस करने के लिए रोस्लिन को कैसे प्राप्त किया जाए जब असेंबली के पास mscorlib 2.0.5.0 और 4.0.0.0

मैं एक बड़े कार्यक्रम के हिस्से के रूप में अपनी कक्षा को रोस्लिन के साथ संकलित करना चाहता हूं, लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है। मेरे रोसलिन संकलक कोड बहुत minimalistic है

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(s); 
      string assemblyName = Path.GetRandomFileName(); 

      List<MetadataReference> references = new List<MetadataReference>() 
      { 
       MetadataReference.CreateFromFile(typeof(DataServiceActionQuery).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(ODataAction).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(GeneratedCodeAttribute).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(IEdmModel).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(TimeOfDay).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(object).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location), 
       MetadataReference.CreateFromFile(typeof(XmlDocument).Assembly.Location), 
       // MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile328\mscorlib.dll") 

      }; 

      references.AddRange(Directory.GetFiles(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades").Select(f => MetadataReference.CreateFromFile(f))); 

      var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); 
      //op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
      //CSharpCompilationOptions.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
      CSharpCompilation compilation = CSharpCompilation.Create(
       assemblyName, 
       syntaxTrees: new[] { syntaxTree }, 
       references: references, 
       options: op); 
      Assembly assembly = null; 
      using (var ms = new MemoryStream()) 
      { 
       EmitResult result = compilation.Emit(ms); 

       if (!result.Success) 
       { 
        IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 
         //diagnostic.IsWarningAsError || 
         diagnostic.Severity == DiagnosticSeverity.Error); 

        foreach (Diagnostic diagnostic in failures) 
        { 
         Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); 
        } 
       } 
       else 
       { 
        ms.Seek(0, SeekOrigin.Begin); 
        assembly = Assembly.Load(ms.ToArray());     
       } 
     } 

इन त्रुटियों कर रहे हैं मैं

CS0012: प्रकार 'वस्तु' एक विधानसभा संदर्भित नहीं है में परिभाषित किया गया है। आपको असेंबली 'mscorlib, संस्करण = 2.0.5.0, संस्कृति = तटस्थ, PublicKeyToken = 7cec85d7bea7798e, retargetable = Yes' का संदर्भ जोड़ना होगा।

CS0012: प्रकार 'XmlReader' को उस असेंबली में परिभाषित किया गया है जिसका संदर्भ नहीं दिया गया है। आपको असेंबली 'System.Xml, संस्करण = 2.0.5.0, संस्कृति = तटस्थ, PublicKeyToken = 7cec85d7bea7798e, retargetable = Yes' का संदर्भ जोड़ना होगा।

+0

आप एक विधानसभा अपने app.config करने के लिए उन विधानसभाओं के लिए अनुप्रेषित जोड़ने की कोशिश की? (और * .exe.config के विस्तार से) – Guvante

+0

मैं कुछ भी करने के लिए असेंबली रीडायरेक्ट नहीं कर सकता - यह भी नहीं सोचता कि यह समस्या है। समस्या यह है कि मैं रोसलीन कंपाइलर कैसे स्थापित करता हूं। – sjkp

+0

आईआईआरसी 'डेस्कटॉपएस्प्लोर्सइडेन्टिटी कॉम्पैयर' ने एक बार मेरे लिए इस मुद्दे को हल किया। नोट हालांकि, 'CSharpCompilationOptions' भी अपरिवर्तनीय है ... क्या आपने' op = op.SAssemblyIdentityComparer (डेस्कटॉपAssemblyIdentityComparer.Default) 'की कोशिश की है? – m0sa

उत्तर

4

जैसा कि आपने टिप्पणियों में भविष्यवाणी की है DesktopAssemblyIdentityComparer समाधान है। हालांकि, CSharpCompilationOptions अपरिवर्तनीय है, और WithAssemblyIdentityComparer विधि एक नया उदाहरण देता है, तो आप इस तरह इसका इस्तेमाल करने के लिए है:

var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); 
op = op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default); 
CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName, 
    syntaxTrees: new[] { syntaxTree }, 
    references: references, 
    options: op); 
संबंधित मुद्दे