none
c# 能不能预编译呢? RRS feed

  • 问题

  •        我在程序中 使用 c# 中的动态编译对象  来编译 写的程序,这样的话  太慢了, 能不能我在 真正执行程序之前 , 先对这个代码体 来个预编译, 然后真正用的时候在去执行呢?  现在没有一点思路, 急切等待中....,如果有好的方案 给个建议吧, 小弟谢了,


    efforts..

    2012年6月21日 7:35

答案

  • 哦 ,你说的是这个啊...

    我以前用这个写ORM工具 呵呵...据我所知你还是可以把代码直接编译成程序集..到时候调用

    System.CodeDom.Compiler.ICodeCompiler comp = provider.CreateCompiler();
    System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
    cp.ReferencedAssemblies.Add("system.dll") ;
    cp.ReferencedAssemblies.Add("system.data.dll") ;
    cp.ReferencedAssemblies.Add("system.xml.dll") ;
    cp.GenerateExecutable = false ;
    cp.GenerateInMemory = true ;
    string code = @"using System;
        using System.Data;   
        using System.Xml;      
        public class Judgement
        {        
          public object GetJude()
          {   
            return (" + expression + @");   
          }   
        }" ;
    System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp,code);
    System.Diagnostics.Debug.Write(code);
    if(cr.Errors.HasErrors)
    {
     System.Text.StringBuilder errorMsg = new System.Text.StringBuilder();
      
     foreach(System.CodeDom.Compiler.CompilerError err in cr.Errors)
     {
      errorMsg.Append(err.ErrorText );
     }
     System.Diagnostics.Debug.WriteLine(errorMsg.ToString());
      
     throw new System.Exception("编译错误: " + errorMsg.ToString());
     //return false;
    }
    else
    {
     System.Reflection.Assembly tmp = cr.CompiledAssembly;
     object _Compiled = tmp.CreateInstance("Judgement");
     System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("GetJude");
     
     return mi.Invoke(_Compiled,null);
    }
    

    2012年6月25日 2:16
    版主

全部回复

  • Hi Efforts,

    欢迎来到C#论坛。

    我不确定完全理解了你的意思,或许你可以试试创建单元测试。通过单元测试,可以快速地检查项目中各个类的方法中是否有逻辑错误。

    如何:创建和运行单元测试

    http://msdn.microsoft.com/zh-cn/library/dd286656.aspx

    祝你愉快。


    Bob Shen [MSFT]
    MSDN Community Support | Feedback to us


    2012年6月22日 7:47
    版主
  • >>动态编译对象  来编译 写的程序,这样的话  太慢了

    什么动态编译对象?dynamic?

    >>先对这个代码体 来个预编译, 然后真正用的时候在去执行呢?

    什么预编译?你要“先编译,后执行”?请具体说明!谢谢。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月23日 6:58
    版主
  •  你的意思是第一次c#执行的时候会编译一次是吗?然后第一次运行较慢?第二次才会快? 你是希望能够第一次自动就编译好。。?

    2012年6月23日 14:09
    版主
  • 楼主应该问的是web编程吧?

    asp.net 与 mvc 是有预编译.

    深入剖析ASP.NET的编译原理之二:预编译(Precompilation)

    ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[1]-加快第一次執行回應速度

    如果是非 web 的话,那么应该分为两种单一的解决方案.一个是要源码解决方案,并外一个是测试解决方案.这样做的好处就是当你重新打开测试解决方案,是不需要生成源码解决方案.当然坏处就是很麻烦.
    • 已编辑 钱仔 2012年6月24日 3:38
    2012年6月24日 3:30
  •     非常感谢各位的回复...., 我用的是c#的动态编译,如:  ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); 想在真正执行这段代码直接给他来个 预编译,这样可以吗? 不是web的,是winform的....


    efforts..

    2012年6月25日 1:31
  • 你好:)

    我还是没有理解您的意思……:(

    你预编译之后当然可以执行,不过你是局部编译……怎么和其它代码整合呢?那倒不如你直接在VS中使用编译然后直接生成exe运行……


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月25日 2:00
    版主
  • 哦 ,你说的是这个啊...

    我以前用这个写ORM工具 呵呵...据我所知你还是可以把代码直接编译成程序集..到时候调用

    System.CodeDom.Compiler.ICodeCompiler comp = provider.CreateCompiler();
    System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
    cp.ReferencedAssemblies.Add("system.dll") ;
    cp.ReferencedAssemblies.Add("system.data.dll") ;
    cp.ReferencedAssemblies.Add("system.xml.dll") ;
    cp.GenerateExecutable = false ;
    cp.GenerateInMemory = true ;
    string code = @"using System;
        using System.Data;   
        using System.Xml;      
        public class Judgement
        {        
          public object GetJude()
          {   
            return (" + expression + @");   
          }   
        }" ;
    System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp,code);
    System.Diagnostics.Debug.Write(code);
    if(cr.Errors.HasErrors)
    {
     System.Text.StringBuilder errorMsg = new System.Text.StringBuilder();
      
     foreach(System.CodeDom.Compiler.CompilerError err in cr.Errors)
     {
      errorMsg.Append(err.ErrorText );
     }
     System.Diagnostics.Debug.WriteLine(errorMsg.ToString());
      
     throw new System.Exception("编译错误: " + errorMsg.ToString());
     //return false;
    }
    else
    {
     System.Reflection.Assembly tmp = cr.CompiledAssembly;
     object _Compiled = tmp.CreateInstance("Judgement");
     System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("GetJude");
     
     return mi.Invoke(_Compiled,null);
    }
    

    2012年6月25日 2:16
    版主