如题所述
å¦ä½ç¨C#å¨æç¼è¯ãæ§è¡ä»£ç
å¨å¼å§ä¹åï¼å çæå 个类åé¨åå±æ§ãæ¹æ³ï¼CSharpCodeProviderãICodeCompilerãCompilerParametersãCompilerResultsãAssemblyã
ä¸ãCSharpCodeProvider
æä¾å¯¹C#代ç çæå¨å代ç ç¼è¯å¨çå®ä¾ç访é®ãå¦æè¦å¨æçæVB代ç ï¼å¯ä»¥ä½¿ç¨VBCodeProviderã
CreateCompiler()ï¼è·åç¼è¯å¨çå®ä¾ã
äºãICodeCompiler
å®ä¹ç¨äºè°ç¨æºä»£ç ç¼è¯çæ¥å£æ使ç¨æå®ç¼è¯å¨çCodeDOMæ ãæ¯ç§ç¼è¯æ¹æ³é½æ¥åæ示ç¼è¯å¨çCompilerParameters对象ï¼å¹¶è¿åæ示ç¼è¯ç»æçCompilerResults对象ã
CompilerAssemblyFromSource(CompilerParameters option, string source)ï¼ä½¿ç¨æå®çç¼è¯å¨ï¼ä»å å«æºä»£ç çå符串设置ç¼è¯ç¨åºéã
ããä¸ãCompilerParameters
ãããã表示ç¨äºè°ç¨ç¼è¯å¨çåæ°ã
ããããReferencedAssembliesï¼è·åå½å项ç®æå¼ç¨çç¨åºéãAddæ¹æ³ä¸ºç¨åºéæ·»å å¼ç¨ã
ããããGenerateExecutableï¼è·åæ设置ä¸ä¸ªå¼ï¼è¯¥å¼æ示æ¯å¦çæå¯æ§è¡æ件ãè¥æ¤å±æ§ä¸ºfalseï¼åçæDLLï¼é»è®¤æ¯falseã
ããããGenerateInMemoryï¼è·åæ设置ä¸ä¸ªå¼ï¼è¯¥å¼æ示æ¯å¦å¨å åä¸çæè¾åºã
ããåãCompilerResults
ãããã表示ä»ç¼è¯å¨è¿åçç¼è¯ç»æã
ããããCompiledAssemblyï¼è·åæ设置以ç¼è¯çç¨åºéï¼Assemblyç±»åã
ããäºãAssembly
ããããå°±æ¯ç¨åºéäºï¼ä¸ç¥éå¦ä½æè¿°äºï¼ã
ãã大è´äºè§£äºä»¥ä¸ç¥è¯ä¹åï¼å°±å¯ä»¥ä½¿ç¨C#å¨æçç¼è¯å¹¶æ§è¡ä»£ç äºï¼ä¸ä¸æ¯ä¸æ®µç¤ºä¾ç¨åºï¼using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;using System.CodeDom;
using System.CodeDom.Compiler;using System.Text;
namespace ConsoleApplication1
{ public class Program
{ static void Main(string[] args)
{ // 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); // 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true; // 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode()); if (cr.Errors.HasErrors)
{
Console.WriteLine("ç¼è¯é误ï¼"); foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
} else
{ // éè¿åå°ï¼è°ç¨HelloWorldçå®ä¾
Assembly objAssembly = cr.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
Console.WriteLine(objMI.Invoke(objHelloWorld, null));
}
Console.ReadLine();
} static string GenerateCode()
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public string OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return \"Hello world!\";");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}"); string code = sb.ToString();
Console.WriteLine(code);
Console.WriteLine(); return code;
}
}
}
å¨å¼å§ä¹åï¼å çæå 个类åé¨åå±æ§ãæ¹æ³ï¼CSharpCodeProviderãICodeCompilerãCompilerParametersãCompilerResultsãAssemblyã
ä¸ãCSharpCodeProvider
æä¾å¯¹C#代ç çæå¨å代ç ç¼è¯å¨çå®ä¾ç访é®ãå¦æè¦å¨æçæVB代ç ï¼å¯ä»¥ä½¿ç¨VBCodeProviderã
CreateCompiler()ï¼è·åç¼è¯å¨çå®ä¾ã
äºãICodeCompiler
å®ä¹ç¨äºè°ç¨æºä»£ç ç¼è¯çæ¥å£æ使ç¨æå®ç¼è¯å¨çCodeDOMæ ãæ¯ç§ç¼è¯æ¹æ³é½æ¥åæ示ç¼è¯å¨çCompilerParameters对象ï¼å¹¶è¿åæ示ç¼è¯ç»æçCompilerResults对象ã
CompilerAssemblyFromSource(CompilerParameters option, string source)ï¼ä½¿ç¨æå®çç¼è¯å¨ï¼ä»å å«æºä»£ç çå符串设置ç¼è¯ç¨åºéã
ããä¸ãCompilerParameters
ãããã表示ç¨äºè°ç¨ç¼è¯å¨çåæ°ã
ããããReferencedAssembliesï¼è·åå½å项ç®æå¼ç¨çç¨åºéãAddæ¹æ³ä¸ºç¨åºéæ·»å å¼ç¨ã
ããããGenerateExecutableï¼è·åæ设置ä¸ä¸ªå¼ï¼è¯¥å¼æ示æ¯å¦çæå¯æ§è¡æ件ãè¥æ¤å±æ§ä¸ºfalseï¼åçæDLLï¼é»è®¤æ¯falseã
ããããGenerateInMemoryï¼è·åæ设置ä¸ä¸ªå¼ï¼è¯¥å¼æ示æ¯å¦å¨å åä¸çæè¾åºã
ããåãCompilerResults
ãããã表示ä»ç¼è¯å¨è¿åçç¼è¯ç»æã
ããããCompiledAssemblyï¼è·åæ设置以ç¼è¯çç¨åºéï¼Assemblyç±»åã
ããäºãAssembly
ããããå°±æ¯ç¨åºéäºï¼ä¸ç¥éå¦ä½æè¿°äºï¼ã
ãã大è´äºè§£äºä»¥ä¸ç¥è¯ä¹åï¼å°±å¯ä»¥ä½¿ç¨C#å¨æçç¼è¯å¹¶æ§è¡ä»£ç äºï¼ä¸ä¸æ¯ä¸æ®µç¤ºä¾ç¨åºï¼using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;using System.CodeDom;
using System.CodeDom.Compiler;using System.Text;
namespace ConsoleApplication1
{ public class Program
{ static void Main(string[] args)
{ // 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); // 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true; // 4.CompilerResults
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode()); if (cr.Errors.HasErrors)
{
Console.WriteLine("ç¼è¯é误ï¼"); foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
} else
{ // éè¿åå°ï¼è°ç¨HelloWorldçå®ä¾
Assembly objAssembly = cr.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
Console.WriteLine(objMI.Invoke(objHelloWorld, null));
}
Console.ReadLine();
} static string GenerateCode()
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public string OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return \"Hello world!\";");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}"); string code = sb.ToString();
Console.WriteLine(code);
Console.WriteLine(); return code;
}
}
}
温馨提示:答案为网友推荐,仅供参考