using Microsoft.CSharp; |
using System; |
using System.CodeDom; |
using System.CodeDom.Compiler; |
using System.Collections.Generic; |
using System.Linq; |
using System.Reflection; |
using System.Text; |
using System.Threading.Tasks; |
namespace 测试程序.帮助 |
{ |
public class CreateNameSpace |
{ |
public void mia ( ) |
{ |
CreateNameSpace CNS = new CreateNameSpace(); |
CodeNamespace nspace = CNS.CreateCodeDomHelloDemo(); |
Console.WriteLine(CNS.GengerCode(nspace)); |
string filename = "HelloWorld.exe" ; |
CompilerResults result = CNS.Execute(nspace, filename); |
if (result.Errors.HasErrors) //是否存在错误; |
{ |
for ( int i = 0; i < result.Output.Count; i++) |
Console.WriteLine(result.Output[i]); |
for ( int i = 0; i < result.Errors.Count; i++) |
Console.WriteLine(i.ToString() + ": " + result.Errors[i].ToString()); |
} |
else |
{ |
result.GetType(); |
System.Diagnostics.Process.Start(filename); //这里比较懒,不想动手去自己打开,呵呵; |
} |
Console.Read(); |
} |
/// <summary> |
/// 生成namspace并加入方法 |
/// </summary> |
/// <returns></returns> |
public CodeNamespace CreateCodeDomHelloDemo ( ) |
{ |
//CodeMemberMethod method = new CodeMemberMethod();//方法声明; |
//method.Name = "SayHello";// 方法名 |
//method.Attributes = MemberAttributes.Public | MemberAttributes.Final;//属性 |
//method.ReturnType = new CodeTypeReference(typeof(string));//返回类型 |
//method.Statements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression("Hello from code!")));//方法体,只有一句返回语句return "Hello from code!"; |
//CodeEntryPointMethod main = new CodeEntryPointMethod();//主方法Main |
//main.Statements.Add(new CodeVariableDeclarationStatement("HelloWord", "hw", |
// new CodeObjectCreateExpression("HelloWord", new CodeExpression[] { })));//变量声明:HelloWord hw = new HelloWord(); |
//CodeMethodInvokeExpression methodinvoke = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("hw"), "SayHello", new CodeExpression[] { }); |
//main.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "WriteLine", methodinvoke)); |
//main.Statements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "Read"));//两个方法调用:System.Console.WriteLine(hw.SayHello()); |
CodeTypeDeclaration helloword = new CodeTypeDeclaration( "HelloWord" ); //类型Class声明 |
helloword.Attributes = MemberAttributes.Public; |
CodeMemberField F = new CodeMemberField( typeof (String), "name" ); |
F.Attributes = MemberAttributes.Public; |
helloword.Members.Add(F); |
helloword.BaseTypes.Add( "测试程序.MongoDAL.MongoBaseEntity" ); |
//helloword .BaseTypes.Add() |
//helloword.Members.AddRange(new CodeTypeMember[] { method, main });//添加方法到clss |
CodeNamespace nspace = new CodeNamespace( "HelloDemo1" ); //命名空间声明 |
nspace.Imports.Add( new CodeNamespaceImport( "System" )); //引入程序命名空间:using System; |
nspace.Imports.Add( new CodeNamespaceImport( "测试程序.MongoDAL" )); //引入程序命名空间:using System; |
nspace.Types.Add(helloword); // |
return nspace; |
} |
/// <summary> |
/// Print 代码 |
/// </summary> |
/// <param name="nspace"></param> |
/// <returns></returns> |
public string GengerCode ( CodeNamespace nspace ) |
{ |
StringBuilder sb = new StringBuilder(); |
System.IO.StringWriter sw = new System.IO.StringWriter(sb); |
CodeGeneratorOptions geneOptions = new CodeGeneratorOptions(); //代码生成选项 |
geneOptions.BlankLinesBetweenMembers = false ; |
geneOptions.BracingStyle = "C" ; |
geneOptions.ElseOnClosing = true ; |
geneOptions.IndentString = " " ; |
CodeDomProvider.GetCompilerInfo( "c#" ).CreateProvider().GenerateCodeFromNamespace(nspace, sw, geneOptions); //代码生成 |
sw.Close(); |
return sb.ToString(); |
} |
/// <summary> |
/// 编译并在内存或io中生成文件 |
/// </summary> |
/// <param name="nspace"></param> |
/// <param name="filename"></param> |
/// <returns></returns> |
public CompilerResults Execute ( CodeNamespace nspace, string filename ) |
{ |
CodeCompileUnit unit = new CodeCompileUnit(); //code编译单元 |
unit.Namespaces.Add(nspace); |
CodeDomProvider provider = CodeDomProvider.CreateProvider( "C#" ); |
CompilerParameters options = new CompilerParameters(); // |
options.GenerateInMemory = true ; //是否在内存中生成; |
options.IncludeDebugInformation = true ; // 包含调试信息; |
options.ReferencedAssemblies.Add( "System.dll" ); |
//options.OutputAssembly = filename; |
//if (System.IO.Path.GetExtension(filename).ToLower() == ".exe") |
//{ |
// options.GenerateExecutable = true;//true为可执行exe,false:dll |
//} |
//else |
//{ |
// options.GenerateExecutable = false;//true为可执行exe,false:dll |
//} |
return provider.CompileAssemblyFromDom(options, unit); //编译程序集 |
} |
} |
} |
by: 发表于:2017-12-27 10:09:25 顶(0) | 踩(0) 回复
??
回复评论