程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .net 動態編譯解決考勤計算問題

.net 動態編譯解決考勤計算問題

編輯:C#入門知識

       由於公司實施SAP HR項目,但是SAP HR對考勤功能真的太弱化了,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Data;

namespace EDICLibrary
{
    public class DynCompiler:IDisposable
    {

        CodeDomProvider _codeprovide;
        CompilerParameters _parameters; 
        CompilerResults _result = null;
        MethodInfo _method = null;
        Object _instance = null;
       
       
        public DynCompiler()
        {
            _codeprovide = new CSharpCodeProvider();
            _parameters = new CompilerParameters();
            _parameters.GenerateExecutable = false;
            _parameters.GenerateInMemory = true;
            _parameters.ReferencedAssemblies.Add("System.dll");
            _parameters.ReferencedAssemblies.Add("System.Data.dll");
            _parameters.ReferencedAssemblies.Add("System.Xml.dll");
        }

        public bool SourceCompiler(string source, out string outputMsg)
        {
             outputMsg = "";
             StringBuilder sbout = new StringBuilder();
             StringBuilder sb = new StringBuilder();
            if (string.IsNullOrEmpty(source))
            {
                outputMsg = "源代碼不能為空!";
                return false;
            }
            else
            {
               
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Text;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine ("using System.Xml;");
                sb.AppendLine("namespace JMCompiler");
                sb.AppendLine("{");
                sb.AppendLine("public class DynCompilerHelper");
                sb.AppendLine("{");
                sb.AppendLine("public DataTable Calculate(DataTable dtShiftInfo,DataTable dtTimes)");
                sb.AppendLine("{");
                sb.Append(source);
                sb.Append("}");
                sb.AppendLine("}");
                sb.AppendLine("}");
            }
            _result  =  _codeprovide.CompileAssemblyFromSource(_parameters, sb.ToString());
            if (_result.Errors.HasErrors)
            {
                foreach (string str in _result.Output)
                {
                    sbout.AppendLine(str);
                }
                outputMsg = sbout.ToString();
                return false;
            }
            else
            {
                Type _type = _result.CompiledAssembly.GetType("JMCompiler.DynCompilerHelper");
                _instance = Activator.CreateInstance(_type);
                _method = _type.GetMethod("Calculate",new Type[]{typeof(DataTable),typeof (DataTable)});
                outputMsg = "編譯成功";
                return true;
            }

        }

        public object GetReturnResult(List<DataTable> parameters)
        {             

            if (_method == null)
            {
                  throw new Exception ("未進行代碼編譯");
            }
            return _method.Invoke(_instance, parameters.ToArray());   
        }

        
        #region IDisposable 成員

        public void Dispose()
        {
             _codeprovide = null;
             _parameters = null;
             _result = null;
             _method = null;
             _instance = null;
        }

        #endregion
    }
}

    
         
         
         
         
         
         
          DataTable Calculate( source, DataTable dtShiftInfo, DataTable dtTimes,   (=  =  result = complier.SourceCompiler(source, <DataTable> lstData =  List<DataTable>= = 

 

  
                 Source = 
                Source  = <獲取計算工式的方法>                 
                
= MIS.Util.AttdCalculate.Calculate(Source, dtShiftInfo, dtTimes,  msg);

 

在寫這篇文章的時候,開發的功能還沒有投入到正式運行,但是經過最近一段時候的測試來看,沒有任何問題。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved