2009-03-02 16 views
28

पर गतिशील रूप से डीएलएल असेंबली उत्पन्न करना वर्तमान में मेरे पास कुछ कोड है जो गतिशील रूप से उत्पन्न किया जा रहा है। दूसरे शब्दों में, एक सी # .cs फ़ाइल प्रोग्राम द्वारा गतिशील रूप से बनाई गई है, और इरादा इस सी # फ़ाइल को किसी अन्य प्रोजेक्ट में शामिल करना है।रन टाइम

चुनौती यह है कि मैं एक सी # .cs फ़ाइल उत्पन्न करने के बजाय एक डीएलएल फ़ाइल जेनरेट करना चाहता हूं ताकि इसे किसी भी प्रकार के .NET एप्लिकेशन (न केवल सी #) द्वारा संदर्भित किया जा सके और इसलिए अधिक उपयोगी हो।

उत्तर

37
using System.CodeDom.Compiler; 
using System.Diagnostics; 
using Microsoft.CSharp; 

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.OutputAssembly = "AutoGen.dll"; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters, yourCodeAsString); 

http://support.microsoft.com/kb/304655

+0

नोट: इस कोड के पुराने संस्करणों के जो का उपयोग कर प्रदाता से एक संकलक बनाने कोड की एक अतिरिक्त पंक्ति है CSharpCodeProvider.CreateCompiler()। यह बहिष्कृत है, आपको सीधे प्रदाता पर संकलन करना चाहिए। –

3

से अनुकूलित अभी, आपका सर्वश्रेष्ठ दांव CSharpCodeProvider है; 4.0 के लिए योजनाओं में "एक सेवा के रूप में कंपाइलर" शामिल है, जो इसे पूरी तरह से प्रबंधित करेगा।

+0

विषय का शीर्षक "जनरेटिंग-डीएल-असेंबली-गतिशील रूप से-रन-टाइम" नहीं है "नहीं" उत्पन्न करना-EXE-assembly-गतिशील रूप से-रन-टाइम "आपका लिंक विवरण रनटाइम पर exe बनाते हैं। –

+1

@ अमीन गढ़ेरी और किसने exe के बारे में कुछ कहा? यदि आपका मतलब है "लेकिन एमएसडीएन पर कोड नमूना एक exe बनाता है" - यह खुशी से डीएलएस भी बना देगा; आखिरकार, फ़ाइल पैकेज * नहीं * असेंबली –

28

यह (पिछले पोस्टर उल्लेख किया .NET 4.0 का प्रयोग करके) करने का गैर पदावनत रास्ता:

using System.CodeDom.Compiler; 
using System.Reflection; 
using System; 
public class J 
{ 
    public static void Main() 
    {  
     System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
     parameters.GenerateExecutable = false; 
     parameters.OutputAssembly = "AutoGen.dll"; 

     CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, "public class B {public static int k=7;}"); 

     //verify generation 
     Console.WriteLine(Assembly.LoadFrom("AutoGen.dll").GetType("B").GetField("k").GetValue(null)); 
    } 
} 
+0

का दिलचस्प हिस्सा है यदि आप 'पैरामीटर का उपयोग करते हैं। जेनरेटइनमेमरी = सत्य;' आप 'r.CompiledAssembly' के साथ इन-मेमोरी असेंबली प्राप्त कर सकते हैं –

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